题目
class Solution {
public :
int row[ 9 ] , col[ 9 ] ;
vector< vector< int > > a;
int dfs ( int x, int y) {
if ( x== 9 && y== 0 ) return 1 ;
int vis[ 10 ] ; memset ( vis, 0 , sizeof vis) ;
for ( int k= 1 ; k<= 9 ; ++ k) {
if ( row[ x] & ( 1 << ( k- 1 ) ) ) vis[ k] = 1 ;
}
int flag= 0 ;
for ( int j= y; j< 9 ; ++ j) {
if ( a[ x] [ j] ) continue ;
flag= 1 ;
for ( int k= 1 ; k<= 9 ; ++ k) if ( col[ j] & ( 1 << ( k- 1 ) ) ) vis[ k] = 1 ;
int x_= x, y_= j;
while ( x_% 3 ) -- x_;
while ( y_% 3 ) -- y_;
for ( int xx= x_; xx< x_+ 3 ; ++ xx)
for ( int yy= y_; yy< y_+ 3 ; ++ yy) vis[ a[ xx] [ yy] ] = 1 ;
for ( int k= 1 ; k<= 9 ; ++ k) {
if ( vis[ k] ) continue ;
a[ x] [ j] = k, row[ x] |= ( 1 << ( k- 1 ) ) , col[ j] |= ( 1 << ( k- 1 ) ) ;
if ( j+ 1 == 9 ) {
if ( dfs ( x+ 1 , 0 ) ) return 1 ;
} else {
if ( dfs ( x, j+ 1 ) ) return 1 ;
}
a[ x] [ j] = 0 , row[ x] ^= ( 1 << ( k- 1 ) ) , col[ j] ^= ( 1 << ( k- 1 ) ) ;
}
break ;
}
if ( ! flag) return dfs ( x+ 1 , 0 ) ;
else return 0 ;
}
void solveSudoku ( vector< vector< char > > & board) {
vector< int > tmp ( 9 ) ;
for ( int i= 0 ; i< 9 ; ++ i) a. push_back ( tmp) ;
for ( int i= 0 ; i< 9 ; ++ i) {
for ( int j= 0 ; j< 9 ; ++ j) {
a[ i] [ j] = ( board[ i] [ j] == '.' ) ? 0 : ( board[ i] [ j] - '0' ) ;
if ( a[ i] [ j] ) row[ i] |= ( 1 << ( a[ i] [ j] - 1 ) ) , col[ j] |= ( 1 << ( a[ i] [ j] - 1 ) ) ;
}
}
dfs ( 0 , 0 ) ;
for ( int i= 0 ; i< 9 ; ++ i)
for ( int j= 0 ; j< 9 ; ++ j) board[ i] [ j] = a[ i] [ j] ? a[ i] [ j] + '0' : '.' ;
}
} ;