hdu2780

/*
分析:
    简单DFS。
    英语不好,被题目阴了一把-、-。初始所给出的9*9
不一定符合数独的规则,这种情况下就不用填了,直接输
出不能完成。
    读第一遍题的时候就感觉不对劲儿了,不过以往做题
这样玩的不多,就忽略了,然后了WA了一次-、-,然后接
着就想到这点不能忽略了-、-。。


                                                          2012-11-26
*/








#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int ans[10][10];
char str[10][20];
struct A
{
	int x,y;
}E[10];
int k;
int ANS;
int Judge(int x,int y,int j)
{
	int i,l;
	int a,b;
	for(i=0;i<9;i++)	if(ans[i][y]==j && i!=x)	return 1;
	for(l=0;l<9;l++)	if(ans[x][l]==j && l!=y)	return 1;
	for(a=0,i=x/3*3;a<3;a++,i++)
	for(b=0,l=y/3*3;b<3;b++,l++)
	{
		if(i==x && l==y)	continue;
		if(ans[i][l]==j)	return 1;
	}
	return 0;
}
int JUDGE()
{
	int i,l;
	for(i=0;i<9;i++)
	for(l=0;l<9;l++)
	{
		if(ans[i][l]==0)		continue;
		if(Judge(i,l,ans[i][l]))return 1;
	}
	return 0;
}
void DFS(int num)
{
	int j;
	if(num==k)	{ANS=1;return ;}
	if(ANS)		return ;
	for(j=1;j<=9;j++)
	{
		if(Judge(E[num].x,E[num].y,j))	continue;
		ans[E[num].x][E[num].y]=j;
		DFS(num+1);
		if(ANS)	return ;
		ans[E[num].x][E[num].y]=0;
	}
}
int main()
{
	int T,flag=0;
	int i,l;
	scanf("%d",&T);
	while(T--)
	{
		if(flag)	printf("\n");
		k=0;flag=1;
		for(i=0;i<9;i++)	scanf("%s",str[i]);
		for(i=0;i<9;i++)
		for(l=0;l<9;l++)
		{
			ans[i][l]=str[i][l]-'0';
			if(!ans[i][l])	{E[k].x=i;E[k++].y=l;}
		}
		if(JUDGE())	{printf("Could not complete this grid.\n");continue;}

		ANS=0;
		DFS(0);
		if(ANS)
		{
			for(i=0;i<9;i++)
			{
				for(l=0;l<9;l++)	printf("%d",ans[i][l]);
				printf("\n");
			}
		}
		else	printf("Could not complete this grid.\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值