leetCode-37-Sudoku-Solver
题目描述(困难难度)
给定一个数独棋盘,输出它的一个解。
解法一 回溯法
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
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)。
总
回溯法一个很典型的应用了。
作者:windliang
来源:https://windliang.cc
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com