hdu1426

/*
分析:
    很有意思的一道题,DFS的,以后就不怕数独了哈哈~- -I。
    我都用的scanf("%s",str)读入的,因为以前做过一道hdu的
题,说是n*n的表格,用了gets读入,最后发现是n*n的表格,不
过在给的时候,不一定是按照n*n来的 - -III。被坑怕了,就用
这个读入了。不过这个题貌似没有这种现象耶……


                                                2012-07-20
*/







#include"stdio.h"
#include"string.h"


struct A
{
	int x,y;
	int val;
	int hash[10];
}E[85];
int key;
int map[9][9];
int ans;


int judge(int k,int now)
{
	int i,l;
	int a,b;
	int t1,t2;
	a=E[k].x/3;
	a*=3;
	b=E[k].y/3;
	b*=3;
	for(i=0;i<9;i++)
	{
		if(i==E[k].x)			continue;
		if(map[i][E[k].y]==now)	return 1;
	}
	for(l=0;l<9;l++)
	{
		if(l==E[k].y)			continue;
		if(map[E[k].x][l]==now)	return 1;
	}
	t1=a+3;
	t2=b+3;
	for(i=a;i<t1;i++)
	{
		for(l=b;l<t2;l++)
		{
			if(i==E[k].x && l==E[k].y)	continue;
			if(map[i][l]==now)			return 1;
		}
	}
	return 0;
}
void DFS(int k)
{
	int i;
	if(ans)		return ;
	if(k==key)	{ans=1;return ;}
	for(i=1;i<=9;i++)
	{
		if(ans)	return ;
		if(E[k].hash[i]==-1)	continue;
		if(judge(k,i))			continue;
		map[E[k].x][E[k].y]=i;
		E[k].val=i;
		DFS(k+1);
		map[E[k].x][E[k].y]=0;
	}
}


int main()
{
	int i,l;
	int i2,l2;
	char str[5];
	int a,b;
	while(scanf("%s",str)!=-1)
	{
		key=0;
		if(str[0]=='?')	{map[0][0]=0;E[key].x=0;E[key].y=0;key++;}
		else			map[0][0]=str[0]-'0';
		for(l=1;l<9;l++)
		{
			scanf("%s",str);
			if(str[0]=='?')	{map[0][l]=0;E[key].x=0;E[key].y=l;key++;}
			else			map[0][l]=str[0]-'0';
		}


		for(i=1;i<9;i++)
		{
			for(l=0;l<9;l++)
			{
				scanf("%s",str);
				if(str[0]=='?')	{map[i][l]=0;E[key].x=i;E[key].y=l;key++;}
				else			map[i][l]=str[0]-'0';
			}
		}


		for(i=0;i<key;i++)	memset(E[i].hash,0,sizeof(E[i].hash));
		for(i=0;i<key;i++)
		{
			for(l=0;l<9;l++)
			{
				if(l==E[i].y)			continue;
				if(map[E[i].x][l]==0)	continue;
				E[i].hash[map[E[i].x][l]]=-1;
			}
			for(l=0;l<9;l++)
			{
				if(l==E[i].x)			continue;
				if(map[l][E[i].y]==0)	continue;
				E[i].hash[map[l][E[i].y]]=-1;
			}
			a=E[i].x/3;
			a*=3;
			b=E[i].y/3;
			b*=3;
			for(i2=a;i2<a+3;i2++)
			{
				for(l2=b;l2<b+3;l2++)
				{
					if(i2==E[i].x && l2==E[i].y)	continue;
					if(map[i2][l2]==0)				continue;
					E[i].hash[map[i2][l2]]=-1;
				}
			}
		}


		ans=0;
		DFS(0);
		for(i=0;i<key;i++)	map[E[i].x][E[i].y]=E[i].val;
		for(i=0;i<9;i++)
		{
			printf("%d",map[i][0]);
			for(l=1;l<9;l++)	printf(" %d",map[i][l]);
			printf("\n");
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值