class Sudoku {
|
|
grid = null;
|
|
size = 9;
|
|
boxSize = 3;
|
|
|
|
Sudoku(this, puzzle) {
|
|
this.grid = puzzle;
|
|
}
|
|
|
|
isValid(this, row, col, num) {
|
|
for (i = 0; i < 9; i++) {
|
|
if (this.grid[row * 9 + i] == num) {
|
|
return 0;
|
|
}
|
|
}
|
|
for (i = 0; i < 9; i++) {
|
|
if (this.grid[i * 9 + col] == num) {
|
|
return 0;
|
|
}
|
|
}
|
|
boxRow = (row / 3) * 3;
|
|
boxCol = (col / 3) * 3;
|
|
for (i = 0; i < 3; i++) {
|
|
for (j = 0; j < 3; j++) {
|
|
idx = (boxRow + i) * 9 + (boxCol + j);
|
|
if (this.grid[idx] == num) {
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
solve(this) {
|
|
for (row = 0; row < 9; row++) {
|
|
for (col = 0; col < 9; col++) {
|
|
idx = row * 9 + col;
|
|
if (this.grid[idx] == 0) {
|
|
for (num = 1; num <= 9; num++) {
|
|
if (this.isValid(row, col, num)) {
|
|
this.grid[idx] = num;
|
|
if (this.solve()) {
|
|
return 1;
|
|
}
|
|
this.grid[idx] = 0;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
printGrid(this) {
|
|
for (row = 0; row < 9; row++) {
|
|
line = "";
|
|
for (col = 0; col < 9; col++) {
|
|
line += str(this.grid[row * 9 + col]);
|
|
if (col < 8) {
|
|
line += " ";
|
|
}
|
|
if (col == 2 || col == 5) {
|
|
line += "| ";
|
|
}
|
|
}
|
|
print(line);
|
|
if (row == 2 || row == 5) {
|
|
print("------+-------+------");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
puzzle = {
|
|
5, 3, 0, 0, 7, 0, 0, 0, 0,
|
|
6, 0, 0, 1, 9, 5, 0, 0, 0,
|
|
0, 9, 8, 0, 0, 0, 0, 6, 0,
|
|
8, 0, 0, 0, 6, 0, 0, 0, 3,
|
|
4, 0, 0, 8, 0, 3, 0, 0, 1,
|
|
7, 0, 0, 0, 2, 0, 0, 0, 6,
|
|
0, 6, 0, 0, 0, 0, 2, 8, 0,
|
|
0, 0, 0, 4, 1, 9, 0, 0, 5,
|
|
0, 0, 0, 0, 8, 0, 0, 7, 9
|
|
};
|
|
|
|
print("Sudoku Puzzle:");
|
|
print("==============");
|
|
sudoku = new Sudoku(puzzle);
|
|
sudoku.printGrid();
|
|
|
|
print("");
|
|
print("Solving...");
|
|
print("");
|
|
|
|
if (sudoku.solve()) {
|
|
print("Solution:");
|
|
print("=========");
|
|
sudoku.printGrid();
|
|
} else {
|
|
print("No solution exists");
|
|
}
|