http://acm.hdu.edu.cn/showproblem.php?pid=2514
DFS
我的代码
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 int a[10],cnt,ans[10];
5 bool vis[10];
6 bool conect(int x,int y)
7 {
8 if (x>y) {int t=x; x=y; y=t;}
9 switch (x)
10 {
11 case 1:return y==2 || y==3 || y==4;
12 case 2:return y==3 || y==5 || y==6;
13 case 3:return y==4 || y==5 || y==6 || y==7;
14 case 4:return y==6 || y==7;
15 case 5:return y==6 || y==8;
16 case 6:return y==7 || y==8;
17 case 7:return y==8;
18 }
19 }
20 bool ok(int p)
21 {
22 int i;
23 for (i=1;i<=8;i++)
24 if ((conect(i,p) && abs(a[p]-a[i])==1) && a[i]!=0) return 0;
25 return 1;
26 }
27 void dfs(int p)
28 {
29 if (cnt>1) return;
30 while (p<=8 && a[p]) p++;
31 if (p>8)
32 {
33 cnt++;
34 memcpy(ans,a,sizeof(a));
35 return;
36 }
37 for (int i=1;i<=8;i++) if (!vis[i])
38 {
39 vis[i]=1;
40 a[p]=i;
41 if (ok(p)) dfs(p+1);
42 a[p]=0;
43 vis[i]=0;
44 }
45 }
46 int main()
47 {
48 int T,C=0;
49 scanf("%d",&T);
50 int i,flag;
51 while (T--)
52 {
53 cnt=0; flag=1;
54 memset(vis,0,sizeof(vis));
55 memset(a,0,sizeof(a));
56 for (i=1;i<=8;i++)
57 {
58 scanf("%d",&a[i]);
59 vis[a[i]]=1;
60 if (a[i] && !ok(i)) flag=0;
61 }
62 if (flag) dfs(1);
63 printf("Case %d:",++C);
64 if (cnt==1) for (i=1;i<=8;i++) printf(" %d",ans[i]);
65 else if (cnt==0) printf(" No answer");
66 else printf(" Not unique");
67 printf("\n");
68 }
69
70 }