算法:求解数独问题
问题描述:9*9的数独问题,vector<vector>& board
我们使用的是DFS算法,每一层来为board[r][c]确定该填入的数字,我们默认该数独问题是有解的。
我们的目的是找到一个可行解
下面就是我们的算法框架,实际上很简单,我只要考虑当前的所有选择和对策就好了,
void DFS(vector<vector<char>> &board ,int r,int c)
{
if(c==9)
{
flag=true;
return;
}
if(r==9)
{
DFS(board,0,c+1);
return;
}
if(board[r][c]!='.')
{
DFS(board,r+1,c);
return;
}
for(char ch='1';ch<='9';ch++)
{
if(ch可以填在当前位置)
{
board[r][c]=ch;
DFS(board,r+1,c);
if(flag) return;
board[r][c]='.';
}
}
}
情形 | 选择 | 下一步 |
---|---|---|
board[r][c]是’.'(即待填) | 填入可能的数字 | 继续挖掘下一个格子(即board[r+1][c]) |
board[r][c]不是’.’ | 跳过当前选择 | 继续挖掘下一个格子(即board[r+1][c]) |
r==9(此时说明一列数字已经填完) | 跳过当前选择 | 挖掘下一个格子(即board[0][c+1]) |
c==9(此时说明所有数字都填完) | 跳过当前选择 | 结束 |
class Solution {
public:
bool flag=false;
bool isproper(vector<vector<char>>&board,char ch,int r,int c)
{
for (int i = 0; i < 9; i++) {
if (board[r][i] == ch) return false;
if (board[i][c] == ch) return false;
if (board[(r/3)*3 + i/3][(c/3)*3 + i%3] == ch)
return false;
}
return true;
}
void DFS(vector<vector<char>> &board ,int r,int c)
{
if(c==9)
{
flag=true;
return;
}
if(r==9)
{
DFS(board,0,c+1);
return;
}
if(board[r][c]!='.')
{
DFS(board,r+1,c);
return;
}
for(char ch='1';ch<='9';ch++)
{
if(isproper(board,ch,r,c))
{
board[r][c]=ch;
DFS(board,r+1,c);
if(flag) return;
board[r][c]='.';
}
}
}
void solveSudoku(vector<vector<char>>& board) {
DFS(board,0,0);
}
};