第一种方法:
class Solution {
public:
void solveSudoku(vector<vector<char> >& board)
{
solve(board,0);
}
bool solve(vector<vector<char> >& board,int position)
{
if(position==81)
return true;
int x=position/9;
int y=position%9;
if(board[x][y]=='.')
{
for(int i=1;i<=9;i++)
{
board[x][y]=i+'0';
if(check(board,position))
if(solve(board,position+1))
return true;
board[x][y]='.';
}
}
else
{
if(solve(board,position+1))
return true;
}
return false;
}
bool check(vector<vector<char> >& board,int position)
{
int x=position/9;
int y=position%9;
int i,j;
for(i=0;i<9;i++)
{
if(i!=x&&board[i][y]==board[x][y])
return false;
if(i!=y&&board[x][i]==board[x][y])
return false;
}
for(i=x/3*3;i<x/3*3+3;i++)
for(j=y/3*3;j<y/3*3+3;j++)
{
if(i!=x&&j!=y&&board[i][j]==board[x][y])
return false;
}
return true;
}
};
第二种方法,标准的回溯套路:
class Solution {
public:
void solveSudoku(vector<vector<char> >& board)
{
solve(board,0);
}
bool solve(vector<vector<char> >& board,int position)
{
if(position==81)
return true;
int x=position/9;
int y=position%9;
if(board[x][y]!='.')
return solve(board,position+1);
for(int a='1';a<='9';a++)
{
if(check(board,position,a))
{
board[x][y]=a;
if(solve(board,position+1))
return true;
board[x][y]='.';
}
}
return false;
}
bool check(vector<vector<char> >& board,int position,int a)
{
int x=position/9;
int y=position%9;
int i,j;
for(i=0;i<9;i++)
{
if(i!=x&&board[i][y]==a)
return false;
if(i!=y&&board[x][i]==a)
return false;
}
for(i=x/3*3;i<x/3*3+3;i++)
for(j=y/3*3;j<y/3*3+3;j++)
{
if(i!=x&&j!=y&&board[i][j]==a)
return false;
}
return true;
}
};