Untitled
unknown
java
2 years ago
4.0 kB
2
Indexable
Never
import java.util.Scanner; public class Main { static int[][] board = { { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; public static void main(String[] args) { System.out.println("Solving..."); solve(); System.out.println("No more solutions!"); } static boolean possible(int y, int x, int n) { /* Når funksjonen possible blir kalt, så tar den 3 argumenter. * x og y -> som er posisjonen i brettet, og n som er tallet som forsøkes i utvalg posisjon.*/ /* Her iterater vi over raden for å se etter n i samme rad. * Vi returner false, hvis vi møter på n i samme rad. Da ruten ikke er gyldig.*/ for (int i = 0; i < 9; i++) { if (board[y][i] == n) { return false; } } // Her gjør vi det samme, bare for kolonnen for (int i = 0; i < 9; i++) { if (board[i][x] == n) { return false; } } /* Her sjekker vi 3by3 boksen. * Vi har en nested for loop som sjekker 3by3, og vi bruker * xBox og yBox for å skyve den 3 rader og kolonner om gangen. */ int xBox = (x / 3) * 3; int yBox = (y / 3) * 3; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (board[yBox + i][xBox + j] == n) { return false; } } } // Når vi bunnen av metoden så returnerer vi true, fordi det betyr at vi ikke har funnet n // i rad, kolonne eller boks. return true; } static void solve() { for (int y = 0; y < 9; y++) { for (int x = 0; x < 9; x++) { // Når vi skal løse den, går vi fra topp til bunn. if (board[y][x] == 0) { // Vi finner en tom rute. for (int n = 1; n < 10; n++) { // vi sjekker tall fra 1-9 for å ha i ruten. if (possible(y, x, n)) { // Sjekker om tallet er gyldig ved å kalle på metoden. board[y][x] = n; // Tallet er gyldig, og vi setter inn tallet. solve(); // Vi kaller på metoden igjen (recursion), i callstacken // har vi allerde fylt inn forrige tall. board[y][x] = 0; // Siste i callstacken kommer hit når denne når vi møter på en blindvei. // Altså når en rute ikke tar noen tall fra 1-9. } } return; // Recursion break -> Her møter vi på blindveien, etter vi har testet 1-9 i en rute. } } } displayBoard(); // Vi må vise brettet her, fordi vi fortsatt har en call stack. // Når vi når bunnen av funksjonen vil vi gå tilbake til start og når vi // fullfører callstacken, så brettet gå til original oppsett, da vi bare har gjort en recursion på // tomme ruter (n == 0). } static void displayBoard() { // Looper over brettet for å printe ut hver enkelt rute. for (int row = 0; row < board.length; row++) { for (int col = 0; col < board[row].length; col++) { System.out.printf("%2d", board[row][col]); } System.out.println(); } System.out.println(); System.out.println("Press enter for more: "); String nextLine = new Scanner(System.in).nextLine(); } }