Untitled
unknown
java
3 years ago
4.0 kB
10
Indexable
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();
}
}
Editor is loading...