1023 Another Eight Puzzle

Problem Description
Fill the following 8 circles with digits 1~8,with each number exactly once . Conntcted circles cannot be filled with two consecutive numbers.<br>There are 17 pairs of connected cicles:<br>A-B , A-C, A-D<br>B-C, B-E, B-F<br>C-D, C-E, C-F, C-G<br>D-F, D-G<br>E-F, E-H<br>F-G, F-H<br>G-H<br><center><img src=../../../data/images/C150-1010-1.jpg></center><br>Filling G with 1 and D with 2 (or G with 2 and D with 1) is illegal since G and D are connected and 1 and 2 are consecutive .However ,filling A with 8 and B with 1 is legal since 8 and 1 are not consecutive .<br><br>In this problems,some circles are already filled,your tast is to fill the remaining circles to obtain a solution (if possivle).<br>
 

Input
The first line contains a single integer T(1≤T≤10),the number of test cases. Each test case is a single line containing 8 integers 0~8,the numbers in circle A~H.0 indicates an empty circle.<br><br>
 

Output
For each test case ,print the case number and the solution in the same format as the input . if there is no solution ,print “No answer”.If there more than one solution,print “Not unique”.<br>
 

Sample Input
  
  
3<br>7 3 1 4 5 8 0 0<br>7 0 0 0 0 0 0 0<br>1 0 0 0 0 0 0 0<br>
 

Sample Output
  
  
Case 1: 7 3 1 4 5 8 6 2<br>Case 2: Not unique<br>Case 3: No answer<br>
 

Source
ECJTU 2008 Autumn Contest




  1. #include<stdio.h>  
  2. #include<math.h>  
  3. #include<string.h>  
  4. int a[10],vis[10],ans[10],anscnt;  
  5. int abs(int q)  
  6. {  
  7.     if(q<0) return -q;  
  8.     return q;  
  9. }  
  10. int ok()  
  11. {  
  12.     if(abs(a[2]-a[1])!=1&&  
  13.         abs(a[3]-a[1])!=1&&  
  14.         abs(a[4]-a[1])!=1&&  
  15.           
  16.         abs(a[2]-a[3])!=1&&  
  17.         abs(a[2]-a[5])!=1&&  
  18.         abs(a[2]-a[6])!=1&&  
  19.           
  20.         abs(a[3]-a[4])!=1&&  
  21.         abs(a[3]-a[5])!=1&&  
  22.         abs(a[3]-a[6])!=1&&  
  23.         abs(a[3]-a[7])!=1&&  
  24.           
  25.         abs(a[4]-a[6])!=1&&  
  26.         abs(a[4]-a[7])!=1&&  
  27.           
  28.         abs(a[5]-a[6])!=1&&  
  29.         abs(a[5]-a[8])!=1&&  
  30.           
  31.         abs(a[6]-a[7])!=1&&  
  32.         abs(a[6]-a[8])!=1&&  
  33.           
  34.         abs(a[7]-a[8])!=1  
  35.         )  
  36.         return 1;  
  37.     else return 0;  
  38. }  
  39. void DFS(int k)  
  40. {  
  41.     int i,cnt=0;  
  42.     if(k==9)  
  43. //注意这里是k==9 而不是把让它等于8之后放在调用函数的最后面 那样的话 最后一次的赋值就会被还原为0  
  44.         {  
  45.             if(ok())  
  46.             {  
  47.                 anscnt++;  
  48.                 if(anscnt==1)  
  49.                 {  
  50.                     for(i=1;i<=8;i++)  
  51.                         ans[i]=a[i];  
  52.                 }  
  53.             }  
  54.             return;  
  55.         }  
  56.     if(anscnt>=2) return;  
  57.     if(a[k]!=0) DFS(k+1);  
  58.     else  
  59.         for(i=1;i<=8;i++)  
  60.         {  
  61.             if(!vis[i])  
  62.             {  
  63.                 a[k]=i;  
  64.                 vis[i]=1;  
  65.                 DFS(k+1);  
  66.                 a[k]=0;  
  67.                 vis[i]=0;  
  68.             }  
  69.         }  
  70. }  
  71.   
  72. int main()  
  73. {  
  74.     int t,cas=0;  
  75.     scanf("%d",&t);  
  76.     while(t--)  
  77.     {  
  78.         anscnt=0;  
  79.         int i;  
  80.         memset(vis,0,sizeof(vis));  
  81.         memset(ans,0,sizeof(ans));  
  82.         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]);  
  83.         for(i=1;i<=8;i++) vis[a[i]]=1;  
  84.         DFS(1);  
  85.         printf("Case %d: ",++cas);  
  86.         if(anscnt==1)  
  87.         {  
  88.             for(i=1;i<8;i++)  printf("%d ",ans[i]);  
  89.             printf("%d\n",ans[i]);  
  90.         }  
  91.         else if(anscnt==0) printf("No answer\n");  
  92.         else printf("Not unique\n");  
  93.     }  
  94.     return 0;  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值