@author CB at http://forum.byte-welt.net/
*/
public class Sudoku {
private int[][] row = new int[9][9];
private int[][] col = new int[9][9];
private int[][] sqr = new int[9][9];
/**
- Mit solve() kann man das als Parameter übergebene Sudoku prüfen, 0
- bedeutet, noch nicht ausgefüllt, solve() kann auch bereits vollstaen.
- ausgefüllte Sudokus überprüfen, deshalb richtig() vollstae() erste
- Anweisung in solve() und i-- in richtig().
-
-
@param x9x9 das Sudoku, das (ausgefüllt und) überprüft werden soll, bitte
- 9mal9 und 0 = leer, ansonsten nur 1… 9
/
public Sudoku(int[][] x9x9) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
row*[j] = x9x9**[j];
col[j]** = x9x9**[j];
sqr[i / 3 * 3 + j / 3][(i * 3 + j % 3) % 9] = x9x9**[j];
}
}
}
public boolean solveOne(int i) {
if (!richtig(i)) {
return false;
}
if (vollstae(i)) {
return true;
}
int j = i / 9, k = i % 9, l = j / 3 * 3 + k / 3, m = (j * 3 + k % 3) % 9, i2 = i + 1;
if (row[j][k] == 0) {
for (int n = 1; n <= 9; n++) {
row[j][k] = n;
col[k][j] = n;
sqr[l][m] = n;
if (solveOne(i2)) {
return true;
}
}
row[j][k] = 0;
col[k][j] = 0;
sqr[l][m] = 0;
} else if (solveOne(i2)) {
return true;
}
return false;
}
private boolean richtig(int i) {
if (i > 0) { // etwas unschön
i–;
}
int j = i / 9, k = i % 9, l = j / 3 * 3 + k / 3;
// überprüfe (schnell) jeden mit jedem (fast unnötig)
return pruefe(row, j) && pruefe(col, k) && pruefe(sqr, l);
}
private boolean vollstae(int i) {
return i >= 81;
}
private boolean pruefe(int[][] array, int i) {
for (int j = 0; j < 8; j++) { // überprüfe (schnell) jeden mit jedem (fast unnötig)
if (array**[j] == 0) {
continue;
}
for (int k = j + 1; k < 9; k++) {
if (array**[j] == array**[k]) {
return false;
}
}
}
return true;
}
public void printSudoku() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (row**[j] != 0) {
System.out.print(row**[j] + " “);
} else {
System.out.print(“x “);
}
if ((j + 1) % 3 == 0) {
System.out.print(” “);
}
}
if ((i + 1) % 3 == 0) {
System.out.println(””);
}
System.out.println(”");
}
}
public static void main(String[] args) {
Sudoku sudoku = new Sudoku(new int[][]{ // leicht
{3, 0, 0, 0, 1, 5, 0, 4, 2},
{7, 5, 6, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 9, 0, 0, 0, 8},
{0, 0, 0, 3, 0, 0, 4, 0, 0},
{0, 0, 0, 5, 0, 2, 8, 0, 0},
{1, 7, 0, 0, 0, 0, 0, 5, 3},
{0, 0, 1, 0, 0, 7, 9, 8, 6},
{2, 0, 8, 1, 0, 0, 0, 0, 0 },
{0, 0, 0, 0, 3, 6, 1, 2, 5}
});
sudoku.printSudoku();
System.out.println(sudoku.solveOne(0));
sudoku.printSudoku();
sudoku = new Sudoku(new int[][]{ // unmöglich
{3, 0, 0, 0, 1, 5, 0, 4, 2},
{7, 5, 6, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 9, 0, 0, 0, 8},
{0, 0, 0, 3, 0, 0, 4, 0, 0},
{0, 0, 0, 5, 0, 2, 8, 0, 0},
{1, 7, 0, 0, 0, 0, 0, 5, 3},
{0, 0, 1, 0, 0, 7, 9, 8, 6},
{2, 0, 8, 1, 0, 0, 0, 0, 9 },
{0, 0, 0, 0, 3, 6, 1, 2, 5}
});
sudoku.printSudoku();
System.out.println(sudoku.solveOne(0));
sudoku.printSudoku();
sudoku = new Sudoku(new int[9][9] // zeitintensiv
);
sudoku.printSudoku();
System.out.println(sudoku.solveOne(0));
sudoku.printSudoku();
}
}