privatebooleansolveSudoku(char[][] board, int index) { intm= board.length, n = board[0].length; if (index == m * n) { returntrue; }
inti= index / n, j = index % m; if (board[i][j] == '.') { for (chark='1'; k <= '9'; k++) { if (canFill(board, i, j, k)) { board[i][j] = k; if (solveSudoku(board, index + 1)) { returntrue; } board[i][j] = '.'; } } } else { return solveSudoku(board, index + 1); }
returnfalse; }
privatebooleancanFill(char[][] board, int i, int j, char c) { intm= board.length, n = board[0].length;
for (introwIndex=0; rowIndex < i; rowIndex++) { if (board[rowIndex][j] == c) { returnfalse; } } for (introwIndex= i + 1; rowIndex < m; rowIndex++) { if (board[rowIndex][j] == c) { returnfalse; } }
for (intcolIndex=0; colIndex < j; colIndex++) { if (board[i][colIndex] == c) { returnfalse; } } for (intcolIndex= j; colIndex < n; colIndex++) { if (board[i][colIndex] == c) { returnfalse; } }
introwIndex= i / 3 * 3, colIndex = j / 3 * 3; for (intk= rowIndex; k < rowIndex + 3; k++) { for (intl= colIndex; l < colIndex + 3; l++) { if (k == i && l == j) { continue; } else { if (board[k][l] == c) { returnfalse; } } } }