Sudoku Extension UVALive - 4763 搜索

題目:思路非常明確, 九宮的深搜 ,一開始寫的時候一直是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; 
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章