3 7 3 1 4 5 8 0 0 7 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
Case 1: 7 3 1 4 5 8 6 2 Case 2: Not unique Case 3: No answer
http://acm.hdu.edu.cn/showproblem.php?pid=2514
输入8个数 表示 图中a b c d e f g h的位置的值只能为1-8的数 然后相邻的不能是连续的数 即绝对值不能为1 有些数是0 将为0的填成1-8中未使用的数
有多少种方法 如果仅有一种 输出它 有多种 或没有 按样例中那样输出
思路 DFS 搜
#include<stdio.h> #include<math.h> #include<string.h> int a[10],vis[10],ans[10],anscnt; int abs(int q) { if(q<0) return -q; return q; } int ok() { if(abs(a[2]-a[1])!=1&& abs(a[3]-a[1])!=1&& abs(a[4]-a[1])!=1&& abs(a[2]-a[3])!=1&& abs(a[2]-a[5])!=1&& abs(a[2]-a[6])!=1&& abs(a[3]-a[4])!=1&& abs(a[3]-a[5])!=1&& abs(a[3]-a[6])!=1&& abs(a[3]-a[7])!=1&& abs(a[4]-a[6])!=1&& abs(a[4]-a[7])!=1&& abs(a[5]-a[6])!=1&& abs(a[5]-a[8])!=1&& abs(a[6]-a[7])!=1&& abs(a[6]-a[8])!=1&& abs(a[7]-a[8])!=1 ) return 1; else return 0; } void DFS(int k) { int i,cnt=0; if(k==9) //注意这里是k==9 而不是把让它等于8之后放在调用函数的最后面 那样的话 最后一次的赋值就会被还原为0 { if(ok()) { anscnt++; if(anscnt==1) { for(i=1;i<=8;i++) ans[i]=a[i]; } } return; } if(anscnt>=2) return; if(a[k]!=0) DFS(k+1); else for(i=1;i<=8;i++) { if(!vis[i]) { a[k]=i; vis[i]=1; DFS(k+1); a[k]=0; vis[i]=0; } } } int main() { int t,cas=0; scanf("%d",&t); while(t--) { anscnt=0; int i; memset(vis,0,sizeof(vis)); memset(ans,0,sizeof(ans)); scanf("%d %d %d %d %d %d %d %d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]); for(i=1;i<=8;i++) vis[a[i]]=1; DFS(1); printf("Case %d: ",++cas); if(anscnt==1) { for(i=1;i<8;i++) printf("%d ",ans[i]); printf("%d\n",ans[i]); } else if(anscnt==0) printf("No answer\n"); else printf("Not unique\n"); } return 0; }