知道思路后,你也会觉得很简单;
当初想了,很多种想法,后来发现题目,说了有唯一确定的一种,所以不用考虑,有二异性的。
思路,对每个“ * ”进行遍历,知道没有“ * ”为止。
思路,该行和该列,以及他所在的2*2的四方格内也不能有重的,都必须是1,2,3,4;
在查找是否只剩一个数(1,2,3,4,中的一个),是要同时查该行和该列,以及他所在的2*2的四方格,(当初就是没有一块查,导致没有AC一直WA);
下面是代码:
#include<stdio.h>
#include<string.h>
char a1[5][5];
int a[5][5];
int b[6];
int main()
{
int i,j;
int t;
scanf("%d",&t);
int tt=1;
while(t--)
{
memset(a1,0,sizeof(a1));
memset(a,0,sizeof(a));
for(i=0; i<4; i++)
{
scanf("%s",a1[i]);
for(j=0; j<4; j++)
if(a1[i][j]!='*')
a[i][j]=a1[i][j]-'0';
else a[i][j]=0;
}
int flag=1;
while(flag)
{
flag=0;
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
if(a[i][j]==0)
{
memset(b,0,sizeof(b));
for(int p=0; p<4; p++)
b[a[i][p]]=1;
for(int p=0; p<4; p++)
b[a[p][j]]=1;
if((i==0&&j==0)||(i==0&&j==2)||(i==2&&j==0)||(i==2&&j==2))
{
b[a[i][j+1]]=1;
b[a[i+1][j]]=b[a[i+1][j+1]]=1;
}
else if((i==0&&j==1)||(i==0&&j==3)||(i==2&&j==1)||(i==2&&j==3))
{
b[a[i][j-1]]=1;
b[a[i+1][j]]=b[a[i+1][j-1]]=1;
}
else if((i==1&&j==0)||(i==1&&j==2)||(i==3&&j==0)||(i==3&&j==2))
{
b[a[i][j+1]]=1;
b[a[i-1][j]]=b[a[i-1][j+1]]=1;
}
else
{
b[a[i][j-1]]=1;
b[a[i-1][j]]=b[a[i-1][j-1]]=1;
}
int suym=0,sun;
for(int p=1; p<=4; p++)
if(b[p]==0)
suym++,sun=p;
if(suym==1)
a[i][j]=sun,flag=1;
}
}
}
}
printf("Case #%d:\n",tt++);
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
printf("%d",a[i][j]);
printf("\n");
}
}
return 0;
}