題目:思路非常明確, 九宮的深搜 ,一開始寫的時候一直是wa,因爲在從當前行換到下一行的時候座標變換一直有問題,學習了大神的一個變量的深搜,然後轉換成座標的辦法。
#include <bits/stdc++.h>
using namespace std;
const int N = 12;
char mp[N][N];
int row[N][N],col[N][N];
int flag[N][N];
int vis[30];
int t,ans;
void dfs( int k )
{
if ( k==81 ) {
++ans; return ;
}
int x = k/9,y = k%9;
if ( mp[x][y]>='1' && mp[x][y]<='9' ) {
dfs( k+1 ) ;
} else if ( mp[x][y]=='0' ) {
for ( int i=1; i<=9; i++ ) {
if ( row[x][i] || col[y][i] || flag[x/3*3+y/3][i] ) continue;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 1;
dfs( k+1 ) ;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 0;
}
} else if ( mp[x][y]=='e' ) {
for ( int i=2; i<=9; i+=2 ) {
if ( row[x][i] || col[y][i] || flag[x/3*3+y/3][i] ) continue;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 1;
dfs( k+1 ) ;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 0;
}
} else if ( mp[x][y]=='o' ) {
for ( int i=1; i<=9; i+=2 ) {
if ( row[x][i] || col[y][i] || flag[x/3*3+y/3][i] ) continue;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 1;
dfs( k+1 ) ;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 0;
}
} else {
if ( vis[mp[x][y]-'a'] ) {
int i = vis[mp[x][y]-'a'] ;
if ( row[x][i] || col[y][i] || flag[x/3*3+y/3][i] ) return ;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 1;
dfs( k+1 ) ;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 0;
} else {
for ( int i=1; i<=9; i++ ) {
if ( row[x][i] || col[y][i] || flag[x/3*3+y/3][i] ) continue;
vis[ mp[x][y]-'a' ] = i ;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 1;
dfs( k+1 ) ;
row[x][i] = col[y][i] = flag[x/3*3+y/3][i] = 0;
vis[ mp[x][y]-'a' ] = 0 ;
}
}
}
}
int main()
{
cin>>t;
while( t-- )
{
memset( vis,0, sizeof vis );
memset( flag,0,sizeof flag);
memset( row,0,sizeof row ) ;
memset( col,0,sizeof col );
for ( int i=0; i<9; i++ ) scanf("%s",mp[i]);
for ( int i=0; i<9; i++ )
{ for ( int j=0; j<9; j++ ) {
if ( mp[i][j]>='1' && mp[i][j]<='9' ) {
row[i][mp[i][j]-'0'] = 1;
col[j][mp[i][j]-'0'] = 1;
flag[i/3*3+j/3][mp[i][j]-'0'] = 1;
}
}
}
ans = 0 ;
dfs( 0 );
cout<<ans<<endl;
}
return 0;
}