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");
}