Sudoku Extension UVALive

来源:互联网 发布:国外期刊数据库 编辑:程序博客网 时间:2024/05/16 01:11

题目:思路非常明确, 九宫的深搜 ,一开始写的时候一直是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; }


0 0
原创粉丝点击