36. Valid Sudoku
问题描述:
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'
.
问题解析:
1.本题意思是:是给了一个9*9的数组,其中有9个3*3个子矩阵,分别是横向3组,纵向3组,要求每个3*3的子矩阵中数独填写完毕的话应该是1~9的数字,并且,也就是未填写完毕的子矩阵中,不可能会有重复数字出现,并且对于整个9*9的大矩阵,也不会有重复数字出现。这样的9*9数组才是一个可以填写有效的数组,其它的都不是。其中没有填写数字的位置写的是‘.’。
2. 对于本题,可以定义三个辅助数组来判断当前的矩阵是否是合理的。分别是bool row[9][9],col[9][9],smallboard[9][9];
3. row[i][j]其中i代表大矩阵的第i行,j代表大矩阵第i行有没有出现j+1这个数字。col[i][j]代表大矩阵的第i列,j代表大矩阵的第i列有没有出现j+1这个数字。smallboard[i][j]代表第i个子3*3矩阵中,有没有出现重复数字j+1。
代码如下:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board)
{
if(board.empty())
return true;
// 设置一个判断行、列、小九格的数组
bool rowarr[9][9] = {false}, colarr[9][9] = {false}, smallboard[9][9] = {false};
// 依次判断每个方格的数字是否存在
for(int i=0; i<board.size(); ++i)
{
for(int j=0; j<board[i].size(); ++j)
{
if(board[i][j] == '.')
continue;
// 计算当前格子代表的数字索引
int digit = board[i][j] - '0' -1;
//判断是否存在,若存在,则此九宫格不是有效的
if(rowarr[i][digit] || colarr[digit][j] || smallboard[i/3*3+j/3][digit])
return false;
// 设置rowarr、colarr和smallboard;
rowarr[i][digit] = true;
colarr[digit][j] = true;
smallboard[i/3*3+j/3][digit] = true;
}
}
return true;
}
};
37. Sudoku Solver
问题描述:
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...
问题解析:
代码如下:
class Solution {
public:
// 检查当前情况下的九宫格填法是否正确
bool IsValid(vector<vector<char>>& board, int row, int col)
{
// 检查行
for(int i=0; i<board.size(); ++i)
if(i != row && board[i][col] == board[row][col]) return false;
// 检查列
for(int j=0; j<board[0].size(); ++j)
if(j != col && board[row][j] == board[row][col]) return false;
// 检查当前的九个格子
for(int i=row/3*3; i<row/3*3+3; ++i)
{
for(int j=col/3*3; j<col/3*3+3; ++j)
if(i!=row && j!= col && board[i][j] == board[row][col])
return false;
}
return true;
}
// 开始填写九宫格
bool solveSudoku1(vector<vector<char>>& board)
{
for(int i=0; i<9; ++i)
{
for(int j=0; j<9; ++j)
{
// 开始尝试填写数字
if(board[i][j] == '.')
{
for(int k=1; k<10; ++k)
{
board[i][j] = '0' + k;
if(IsValid(board, i, j) && solveSudoku1(board))
return true;
board[i][j] = '.';
}
// 当所有9个数试完都不行时,就应该返回false。
return false;
}
}
}
// 这个返回true,表明已经到了最外层的循环,所有的尝试都已经结束,此时应该返回true。
return true;
}
void solveSudoku(vector<vector<char>>& board)
{
solveSudoku1(board);
return;
}
};