判断是否数独,首先需要了解数独盘面:
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。由行、列、宫组成单元:
行
水平方向的每一横行有九格,每一横行称为行(Row),如图所示。
列
垂直方向的每一纵列有九格,每一纵列称为列(Column),如图所示
宫
三行与三列相交之处有九格,每一单元称为小九宫(Box、Block),简称宫,如图所示。
判断一行或者一列或者某个区域规则:
设置一数组初始值全0,对应下标第一次时,该下标位置所在值加1,如果该区域每个数字有且仅仅一次出现,则最后数组全1,否则一旦有重复,会遇到该数字下标对应值非0(因为第一次已经由0加1了)
bool isValidSudoku(vector<vector<char>>& board) {
if(board.size()==0)return 0;
int row[9],col[9];
int i,j;
for(i=0;i<9;i++)
{ memset(row,0,sizeof(int)*9);
memset(col,0,sizeof(int)*9);
for(j=0;j<9;j++){
if(board[i][j]!='.'){
if(row[board[i][j]-'1']>0)return 0;
else row[board[i][j]-'1']++;}//判断一行是否重复出现
if(board[j][i]!='.'){
if(col[board[j][i]-'1']>0)return 0;
else col[board[j][i]-'1']++;}//判断一列是否重复出现
}
}
for(i=0;i<9;i+=3)
for(j=0;j<9;j+=3)
{
memset(row,0,9*sizeof(int));
for(int m=0;m<3;m++)
for(int n=0;n<3;n++){if(board[i+m][j+n]!='.'){if(row[board[i+m][j+n]-'1']>0)return 0;else
row[board[i+m][j+n]-'1']++;}}
}
return 1; }