hdu2514 Another Eight Puzzle 填数字 搜索水题
2013-05-20 10:00
351 查看
Another Eight Puzzle
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 659 Accepted Submission(s): 405
[align=left]Problem Description[/align]
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).
[align=left]Input[/align]
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.
[align=left]Output[/align]
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”.
[align=left]Sample Input[/align]
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
[align=left]Sample Output[/align]
Case 1: 7 3 1 4 5 8 6 2
Case 2: Not unique
Case 3: No answer
[align=left]Source[/align]
ECJTU 2008 Autumn Contest
[align=left]Recommend[/align]
lcy
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; }
相关文章推荐
- hdu2514 Another Eight Puzzle
- HDU2514 Another Eight Puzzle
- HDU2514 Another Eight Puzzle
- hdu 2514 Another Eight Puzzle 图填数字 next_permutation+暴力
- hdu2514 Another Eight Puzzle (全排列、暴力)
- SDAU 搜索专题 23 Another Eight Puzzle
- Another Eight Puzzle
- hdu 2514 Another Eight Puzzle
- HDU [ Another Eight Puzzle ]——dfs全排列变式
- (全排列)Another Eight Puzzle--HDOJ
- HDU 2514 Another Eight Puzzle(DFS)
- hdu 2514 Another Eight Puzzle
- Another Eight Puzzle (枚举深搜)
- hdu 2514 Another Eight Puzzle(DFS+回溯)
- UVA-1604 Cubic Eight-Puzzle (双向BFS+状态压缩+限制搜索层数)
- HDOJ Another Eight Puzzle
- 【HDU4474 2012成都现场赛K】【搜索-BFS】Yet Another Multiple Problem 最小的要求字符集的数字倍数 余数哈希BFS
- hdu 2514 Another Eight Puzzle(DFS暴搜)
- HDU 2514 Another Eight Puzzle
- hdu 2518(dfs)Another Eight Puzzle