题意:解数独,空缺的方格用.表示。
解法:就是典型的回溯法,用row[i][j],column[i][j],grid[i][j]表示i行,i列,i格j是否用。用flag表示当前是否有解。若有解,则不用再递归下去。可能是leetCode里Hard的题目当中最简单的一题了。
代码:
class Solution {
public:
int row[9][10];
int column[9][10];
int grid[9][10];
int flag=0;
void solve(int r,int c,vector<vector<char>>& board)
{
int i;
if(r==9)
{
flag=1;
return;
}
if(board[r][c]=='.')
{
for(i=1;i<=9;i++)
{
if(row[r][i]==0&&column[c][i]==0&&grid[3*(r/3)+c/3][i]==0)
{
board[r][c]=i+'0';
row[r][i]=1;
column[c][i]=1;
grid[3*(r/3)+c/3][i]=1;
if(c==8) solve(r+1,0,board);
else solve(r,c+1,board);
if(flag==1) return;
board[r][c]='.';
row[r][i]=0;
column[c][i]=0;
grid[3*(r/3)+c/3][i]=0;
}
}
}
else
{
if(c==8) solve(r+1,0,board);
else solve(r,c+1,board);
}
}
void solveSudoku(vector<vector<char>>& board) {
int i,j,k;
for(i=0;i<9;i++)
{
for(j=0;j<10;j++)
row[i][j]=column[i][j]=grid[i][j]=0;
}
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(board[i][j]!='.')
{
k=board[i][j]-'0';
row[i][k]=1;
column[j][k]=1;
grid[(i/3)*3+j/3][k]=1;
}
}
}
solve(0,0,board);
}
};