题目:有效的数独
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.'
表示。
解答:
思路:既然验证有效有三个条件,那就逐一验证每一个条件。即设计三个检验函数;
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
//使用三个检验函数检查所给的数独
return checkCols(board)&&checkRows(board)&&checkGrid(board);
}
public:
//检查每一行
bool checkCols(vector<vector<char>>& val)
{ //对每一行
bool res;
for(int i=0;i<val.size();i++)
{
//对当前行检查是否存在重复元素
for(int j=0;j<val[0].size();j++)
{
if(val[i][j]!='.')
{
for(int k=j+1;k<val[0].size();k++)
{
if(val[i][k]=='.')
continue;
res = val[i][j]==val[i][k];
if(res)
{
return false;
}
}
}
}
}
return true;
}
//检查每一列
bool checkRows(vector<vector<char>>& val)
{//对每一列
bool res;
for(int i=0;i<val[0].size();i++)
{
//对当前列检查是否存在相同元素
for(int j=0;j<val.size();j++)
{
if(val[j][i]!='.')
{
for(int k=j+1;k<val.size();k++)
{
if(val[k][i]=='.')
continue;
res=val[j][i]==val[k][i];
if(res)
{
return false;
}
}
}
}
}
return true;
}
//检查每一个块
bool checkGrid(vector<vector<char>>& val)
{
bool res;
//将块中的元素保存到一个vector中,方便比较是否存在重复元素
vector<char> temp;
//遍历9个方格
for(int i=0;i<9;i+=3)
{
for(int ii=0;ii<9;ii+=3)
{
//将方格中的9个元素放到vector中,并比较
for(int j=0;j<3;j++)
{
for(int k=0;k<3;k++)
{
temp.push_back(val[i+j][ii+k]);
}
}
//检查是否有重复元素
for(int m=0;m<temp.size();m++)
{
if(temp[m]!='.')
{
for(int n=m+1;n<temp.size();n++)
{
if(temp[n]=='.')
continue;
res = temp[m]==temp[n];
if(res)
return false;
}
}
}
temp.clear();
}
}
return true;
}
};
上面方法太麻烦,改进想法, 使用数组a[10],保存每个数字出现的个数,如果当前数字个数大于1,则返回false.'类似于键值对映射;
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
return checkCols(board)&&checkRows(board)&&checkGrid(board);
}
public:
bool checkCols(vector<vector<char>>& val)
{ //对每一行
for(int i=0;i<9;++i)
{
int a[10]={0,0,0,0,0,0,0,0,0,0};
for(int j=0;j<9;++j)
{
if(val[i][j]=='.')
continue;
a[val[i][j]-'0']++;
if(a[val[i][j]-'0']>1)
return false;
}
}
return true;
}
bool checkRows(vector<vector<char>>& val)
{//对每一列
for(int j=0;j<9;++j)
{
int a[10]={0,0,0,0,0,0,0,0,0,0};
for(int i=0;i<9;++i)
{
if(val[i][j]=='.')
continue;
a[val[i][j]-'0']++;
if(a[val[i][j]-'0']>1)
return false;
}
}
return true;
}
bool checkGrid(vector<vector<char>>& val)
{
for(int i=0;i<9;i+=3)
{
for(int j=0;j<9;j+=3)
{
int a[10]={0,0,0,0,0,0,0,0,0,0};
for(int x=i;x<i+3;++x)
{
for(int y=j;y<j+3;++y)
{
if(val[x][y]=='.')
continue;
a[val[x][y]-'0']++;
if(a[val[x][y]-'0']>1)
return false;
}
}
}
}
return true;
}
};