class Solution {
private boolean[][] line = new boolean[9][9];
private boolean[][] column = new boolean[9][9];
private boolean[][][] block = new boolean[3][3][9];
private boolean valid = false;
private List<int[]> spaces = new ArrayList<int[]>();
public void solveSudoku(char[][] board) {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (board[i][j] == '.') {
spaces.add(new int[]{i, j});
} else {
int digit = board[i][j] - '0' - 1;
在i行,j列,第block[i / 3][j / 3]中出现过digit+1
line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;
}
}
}
dfs(board, 0);
}
public void dfs(char[][] board, int pos) {
if (pos == spaces.size()) {
valid = true;
return;
}
获取第pos个空白位置
int[] space = spaces.get(pos);
空白位置的行,列
int i = space[0], j = space[1];
遍历1~9数字,哪个未放入,放入后继续进行递归下个空白位置,直到全部空格填完,进行回溯;
或者1~9都不能放入这个空白位置,回溯
for (int digit = 0; digit < 9 && !valid; ++digit) {
if (!line[i][digit] && !column[j][digit] && !block[i / 3][j / 3][digit]) {
line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;
board[i][j] = (char) (digit + '0' + 1);
dfs(board, pos + 1);
line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = false;
}
}
}
}
37. 解数独--回溯
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 332. 重新安排行程[https://leetcode.cn/problems/reconstruct-itin...
- 摘要 今天以尝试较难的题目为主,为日后复习做准备。 DFS可以看做一个“拆边”的过程,用回溯法来搜索合适的“拆边”...
- 题目简介 注意今天的题目都是困难题,理解较为困难,可以先跳过。 332. 重新安排行程[https://leetc...
- 解题思路 按行按列按九宫建每一个集合将出现的数字加入对应三个集合然后计算出待填位置的候选项对所有位置按照下标项xy...