Valid Sudoku
问题描述:9X9分成9个3X3单独的数独,最后就是要判断这个数独是否是有效的。
Code:
bool isValid(vector<vector<char> >&board,int a,int b)
{
for(int i=0;i<9;i++)
if(i!=a && board[i][b]==board[a][b])
return false;
for(int j=0;j<9;j++)
if(j!=b && board[a][j]==board[a][b])
return false;
int x=a/3*3;
int y=b/3*3;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(x+i!=a && y+j!=b &&board[x+i][y+j]==board[a][b])
return false;
return true;
}
bool isValidSudoku(vector<vector<char> > &board)
{
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
{
if(board[i][j]=='.')
continue;
if(!isValid(board,i,j))
return false;
}
return true;
}
另一种解法:
Bool check(char ch,bool used[9]){
if(ch=='.') return true;
if(used[ch-'1']) return false;
return used[ch-'1']=true;
}
Bool isValidSudoku(const vector<vector<char>>& board){
bool used[9];
for(int i=0;i<9;i++){
fill(used,used+9,false);
for(int j=0;j<9;j++)
if(!check(board[i][j],used)) return false;
fill(used,used+9,false);
for(int j=0;j<9;j++)
if(!check(board[i][j],used)) return false;
}
for(int r=0;r<3;r++)
for(int c=0;c<3;c++){
fill(used,used+9,false);
for(int i=r*3;i<r*3+3;i++)
for(int j=c*3;j<c*3+3;j++)
if(!check(board[i][j],used)) return false;
}
return true;
}