-
Notifications
You must be signed in to change notification settings - Fork 1
/
[leetcode]037-Sudoku Solver[递归].cpp
66 lines (55 loc) · 1.69 KB
/
[leetcode]037-Sudoku Solver[递归].cpp
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
/*
1. 原题
https://leetcode.com/problems/sudoku-solver/
2. 思路
题意:解决一个数独问题,输出结果。
题目保证答案唯一。
数独问题一般都是用暴力破解思想,递归求解。
对每一个空格,依次填入1~9, 判断是否符合数独定义,递归求解下一个空格。
直到填完最后一个空格。
已AC.
*/
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
solve(board);
}
bool solve(vector<vector<char>>& board)
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (board[i][j] == '.')
{
for (int num = 1; num <10; num++)
{
if (isValid(board, i, j, '0'+num))
{
board[i][j] = '0'+num;
if (solve(board)) //dfs next one
return true;
else
board[i][j] = '.'; // number is invalid, recover it
}
}
return false;
}
}
}
return true;
}
bool isValid(vector<vector<char>>& board, int row, int column, char ch)
{
for (int k = 0; k < 9; k++)
{
if (board[row][k] == ch) //row
return false;
if (board[k][column] == ch) //column
return false;
if (board[row/3*3+k/3][column/3*3+k%3] == ch) // sub-box
return false;
}
return true;
}
};