题目:http://acm.hdu.edu.cn/showproblem.php?pid=2514
就是DFS+回溯。。。我蠢蠢的把所有状态枚举了。。
但是在输出处理上没注意。。。WA了几次
下面是AC代码:
#include<iostream>
#include<cstring>
using namespace std;
int a[10],b[10];
int mark[10];
int flag;
int judge(int num,int n)
{
if(n==1&&num==2)
return 1;
if(n==8&&num==7)
return 1;
if((n>1&&n<8)&&(num==(n-1)||num==(n+1)))
return 1;
return 0;
}
int cheak(int pos ,int n)
{
int i;
if(pos==1)
{
for(i=2;i<=4;i++)
if(judge(a[i],n)) return 0;
return 1;
}
if(pos==2)
{
if(judge(a[1],n)) return 0;
if(judge(a[3],n)) return 0;
if(judge(a[5],n)) return 0;
if(judge(a[6],n)) return 0;
return 1;
}
if(pos==3)
{
if(judge(a[1],n)) return 0;
if(judge(a[2],n)) return 0;
for(i=4;i<=7;i++)
if(judge(a[i],n)) return 0;
return 1;
}
if(pos==4)
{
if(judge(a[1],n)) return 0;
if(judge(a[3],n)) return 0;
for(i=6;i<=7;i++)
if(judge(a[i],n)) return 0;
return 1;
}
if(pos==5)
{
if(judge(a[2],n)) return 0;
if(judge(a[3],n)) return 0;
if(judge(a[6],n)) return 0;
if(judge(a[8],n)) return 0;
return 1;
}
if(pos==6)
{
for(i=2;i<=5;i++)
if(judge(a[i],n)) return 0;
return 1;
for(i=7;i<=8;i++)
if(judge(a[i],n)) return 0;
return 1;
}
if(pos==7)
{
if(judge(a[3],n)) return 0;
if(judge(a[4],n)) return 0;
if(judge(a[6],n)) return 0;
if(judge(a[8],n)) return 0;
return 1;
}
if(pos==8)
{
for(i=5;i<=6;i++)
if(judge(a[i],n)) return 0;
return 1;
}
}
void DFS(int pos)
{
int i;
if(pos>8)
{
flag++;
for(i=1;i<=8;i++)
b[i]=a[i];
return ;
}
if(a[pos]==0)
{
for( i=1;i<=8;i++)
{
if(!mark[i]&&cheak(pos,i))
{
mark[i]=1;
a[pos]=i;
DFS(pos+1);
mark[i]=0;
a[pos]=0;
}
}
}
else
DFS(pos+1);
}
int main()
{
int t,i,j;
cin>>t;
for(j=1;j<=t;j++)
{
memset(mark,0,sizeof(mark));
for(i=1;i<=8;i++)
{
cin>>a[i];
mark[a[i]]=1;
}
flag=0;
DFS(1);
if(!flag)
{
printf("Case %d: ",j);
printf("No answer\n");
}
else if(flag>1)
{
printf("Case %d: ",j);
printf("Not unique\n");
}
else
{
printf("Case %d: ",j);
printf("%d",b[1]);
for(i=2;i<=8;i++)
printf(" %d",b[i]);
printf("\n");
}
}
return 0;
}