Another Eight Puzzle |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 149 Accepted Submission(s): 101 |
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.
There are 17 pairs of connected cicles: A-B , A-C, A-D B-C, B-E, B-F C-D, C-E, C-F, C-G D-F, D-G E-F, E-H F-G, F-H G-H ![]() 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 . In this problems,some circles are already filled,your tast is to fill the remaining circles to obtain a solution (if possivle). |
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.
|
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”.
|
Sample Input
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 |
Sample Output
Case 1: 7 3 1 4 5 8 6 2 Case 2: Not unique Case 3: No answer 题目大意:按照给出的图,填数字,相邻的两个数字差不能是1 dfs 枚举 #include<stdio.h> #include<math.h> #include<string.h> using namespace std; 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) { 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)); for(i=1;i<=8;i++) { scanf("%d",&a[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; } |
12-04
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交