题意:
对于每个小的九宫格,行列不同,大的九宫格行列也不同, e表示可以填偶数,o代表可以填奇数。询问有多少种可能,其余的数字只能表示一种数字
思路:
还能说啥。。搜吧! 分块的第几块之前写错了!搞了一个半小时。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int row[110][110];
int con[110][110];
int race[110][110];
char mapp[110][110];
int al[310];
int ans;
void dfs(int x, int y){
if(x > 8){
ans++;
return;
}
while(mapp[x][y] <= '9' && mapp[x][y] > '0'){
y++;
if(y > 8) {
y = 0;
x ++;
}
if(x>8)
{
ans++;
return ;
}
}
char ch = mapp[x][y];
int kax=((x+3)/3 - 1) * 3+(y+3)/3;
if(ch>='a'&&ch<='z' && ch != 'o' && ch != 'e'){
int p = al[ch - 'a'];
if(al[ch - 'a'] > 0){
if(row[x][p] || con[y][p] || race[kax][p]) return;
row[x][p] = 1;
con[y][p] = 1;
race[kax][p] = 1;
mapp[x][y] = p + '0';
dfs(x, y);
mapp[x][y] = ch;
row[x][p] = 0;
con[y][p] = 0;
race[kax][p] = 0;
}
else {
for(int i = 1; i <= 9; i++){
if(row[x][i] || con[y][i] || race[kax][i]) continue;
row[x][i] = 1;
con[y][i] = 1;
race[kax][i] = 1;
mapp[x][y] = i + '0';
al[ch - 'a'] = i;
dfs(x, y);
al[ch - 'a'] = 0;
mapp[x][y] = ch;
row[x][i] = 0;
con[y][i] = 0;
race[kax][i] = 0;
}
}
}
else
for(int i = 1; i <= 9; i++){
if(ch == 'e' && i % 2) continue;
if(ch == 'o' && i % 2 == 0) continue;
if(row[x][i] || con[y][i] || race[kax][i]) continue;
row[x][i] = 1;
con[y][i] = 1;
race[kax][i] = 1;
mapp[x][y] = i + '0';
dfs(x, y);
mapp[x][y] = ch;
row[x][i] = 0;
con[y][i] = 0;
race[kax][i] = 0;
}
}
int main(){
//freopen("a.txt", "w", stdout);
int t;
scanf("%d",&t);
while(t--)
{
memset(row,0,sizeof(row));
memset(con,0,sizeof(con));
memset(race,0,sizeof(race));
memset(al,0,sizeof(al));
memset(mapp,0,sizeof(mapp));
for(int i=0; i<9; i++)
{
scanf("%s", mapp[i]);
for(int j=0; j<9; j++)
{
//scanf("%c",&mapp[i][j]);
//cout << mapp[i][j] << endl;
if(mapp[i][j]>'0'&&mapp[i][j]<='9')
{
int kax=((i+3)/3 - 1) * 3+(j+3)/3;
// printf("%d\n",cnt);
race[kax][mapp[i][j]-'0'] = 1;
row[i][mapp[i][j]-'0'] = 1;
con[j][mapp[i][j]-'0'] = 1;
}
}
}
/*for(int i = 0; i < 10; i++){
puts(mapp[i]);
}puts("--------\n");
/* for(int i=0;i<9;i++)
printf("%s\n",mapp[i]);*/
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
}