UVALive 4763 Sudoku Extension(搜索)

46 篇文章 0 订阅

题意:

对于每个小的九宫格,行列不同,大的九宫格行列也不同, 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);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值