Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'
.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
题目要求我们填数独,将内容为'.'的方格填上数字,我采用的方法是一个一个试,一个一个验证,找到每个内容为'.'的格子,然后尝试填入1-9,分别验证是否正确,因为题目假定有唯一解,所以我们找到一组就算完成任务,以下是代码。
class Solution {
public:
bool isvalid(vector<vector<char>> &board,int row,int col)//判断填入[row][col]位置的数字是否满足数独规则:行、列、方框
{
for(int i=0;i<9;i++)//行验证
if(i!=col&&board[row][col]==board[row][i])
return false;
for(int j=0;j<9;j++)//列验证
if(j!=row&&board[row][col]==board[j][col])
return false;
int a=row/3*3;//方框验证
int b=col/3*3;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i+a==row&&j+b==col)continue;
if(board[i+a][j+b]==board[row][col])
return false;
}
}
return true;
}
bool solvevalid(vector<vector<char>> &board)//解数独
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(board[i][j]=='.')
{
for(int w=0;w<9;w++)
{
board[i][j]='1'+w;
if(isvalid(board,i,j)&&solvevalid(board))//递归的解数独,看当前数字能否能够找到一组解
return true;
board[i][j]='.';
}
return false;
}
}
}
return true;
}
void solveSudoku(vector<vector<char> > &board) {
solvevalid(board);
}
};