您的位置:首页 > 其它

HDU 2514 Another Eight Puzzle

2012-01-13 21:40 344 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2514

DFS

我的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int a[10],cnt,ans[10];
bool vis[10];
bool conect(int x,int y)
{
if (x>y) {int t=x; x=y; y=t;}
switch (x)
{
case 1:return y==2 || y==3 || y==4;
case 2:return y==3 || y==5 || y==6;
case 3:return y==4 || y==5 || y==6 || y==7;
case 4:return y==6 || y==7;
case 5:return y==6 || y==8;
case 6:return y==7 || y==8;
case 7:return y==8;
}
}
bool ok(int p)
{
int i;
for (i=1;i<=8;i++)
if ((conect(i,p) && abs(a[p]-a[i])==1) && a[i]!=0) return 0;
return 1;
}
void dfs(int p)
{
if (cnt>1) return;
while (p<=8 && a[p]) p++;
if (p>8)
{
cnt++;
memcpy(ans,a,sizeof(a));
return;
}
for (int i=1;i<=8;i++) if (!vis[i])
{
vis[i]=1;
a[p]=i;
if (ok(p)) dfs(p+1);
a[p]=0;
vis[i]=0;
}
}
int main()
{
int T,C=0;
scanf("%d",&T);
int i,flag;
while (T--)
{
cnt=0; flag=1;
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
for (i=1;i<=8;i++)
{
scanf("%d",&a[i]);
vis[a[i]]=1;
if (a[i] && !ok(i)) flag=0;
}
if (flag) dfs(1);
printf("Case %d:",++C);
if (cnt==1) for (i=1;i<=8;i++) printf(" %d",ans[i]);
else if (cnt==0) printf(" No answer");
else printf(" Not unique");
printf("\n");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: