题目描述(困难难度)
给定一个数独棋盘,输出它的一个解。
解法一 回溯法
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
public void solveSudoku(char[][] board) {
solver(board);
}
private boolean solver(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.') {
char count = '1';
while (count <= '9') {
if (isValid(i, j, board, count)) {
board[i][j] = count;
if (solver(board)) {
return true;
} else {
//下一个位置没有数字,就还原,然后当前位置尝试新的数
board[i][j] = '.';
}
}
count++;
}
return false;
}
}
}
return true;
}
private boolean isValid(int row, int col, char[][] board, char c) {
for (int i = 0; i < 9; i++) {
if (board[row][i] == c) {
return false;
}
}
for (int i = 0; i < 9; i++) {
if (board[i][col] == c) {
return false;
}
}
int start_row = row / 3 * 3;
int start_col = col / 3 * 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[start_row + i][start_col + j] == c) {
return false;
}
}
}
return true;
}
时间复杂度:
空间复杂度:O(1)。
总
回溯法一个很典型的应用了。
添加好友一起进步~
如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^
如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情
当前内容版权归 wind-liang 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 wind-liang .