37. 解数独

37. 解数独

leetcode 37. 解数独


题目:37. 解数独

编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则:

​ 数字 1-9 在每一行只能出现一次。

​ 数字 1-9 在每一列只能出现一次。

​ 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

空白格用 ‘.’ 表示。

一个数独。

答案被标成红色。

说明:

  • 给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
  • 你可以假设给定的数独只有唯一解。
  • 给定数独永远是 9x9 形式的。

方法:Backtracking(回溯)

思路:Backtracking(回溯),遍历board,找到没有填入数字的点,遍历字符1-9,通过isPut方法判断是否可以填入,直到填完所有点为止。
运行数据:执行用时:9 ms,内存消耗:36.2 MB

复杂度分析:

  • 时间复杂度:O((9!)^9),由于该题board是固定的即9 * 9,所以最坏情况第一行第一个位置有9种情况,第二个位置有8种情况,……,第九个位置有1种可能,即第一行有9!情况,一共有9行所以,时间复杂度为O((9!)^9)。
  • 空间复杂度:O(9 * 9),由于该题board是固定的即9 * 9,所以空间复杂度为O(9 * 9)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// LeetCode指定调用方法 
public void solveSudoku(char[][] board) {

backtracking(board, 0, 0);

}

// 可选填入字符
char[] chars = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};

// 回溯
private boolean backtracking(char[][] board, int x, int y) {

// 当该行的所有列都遍历完时,判断该行是否是最后一行,如果是则说明board已填完,直接结束,如果不是最后一行,则接着遍历下一行
if (y == 9) {
if (x == 8) {
return true;
}
x++;
y = 0;
}

// 如果该位置已填入字符,则遍历下一个位置,否则遍历字符1-9,判断是否可以填入
if (board[x][y] != '.') {
return backtracking(board, x, y + 1);
} else {
// 遍历字符1-9
for (int i = 0; i < 9; i++) {
// 判断字符是否可以填入
if (isPut(board, x, y, chars[i])) {
// 将该字符填入
board[x][y] = chars[i];
// 继续填下一个位置
if (backtracking(board, x, y + 1)) {
return true;
}
// 复原该位置字符
board[x][y] = '.';
}
}
}

return false;
}

// 判断字符ch是否可以填入board[x][y]
private boolean isPut(char[][] board, int x, int y, char ch) {

// 判断行和列是否已有该字符,有则不能填入,返回false
for (int i = 0; i < 9; i++) {
if (board[x][i] == ch || board[i][y] == ch) {
return false;
}
}

// 判断 3x3 宫内是否已有该字符,有则不能填入,返回false
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[(x / 3) * 3 + i][(y / 3) * 3 + j] == ch) {
return false;
}
}
}

return true;
}

学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。

才疏学浅,若有错误或不当之处,可批评指正,还请见谅!


 
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×