Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
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
Source
ECJTU 2008 Autumn Contest
思路:枚举全排列再判断即可。可以写DFS也可以用STL的next_permutation()函数。
AC代码:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; bool map[10][10] = {0}; int orinum[10]; int num[10]; int ans[10]; void init() { map[1][2] = map[1][3] = map[1][4] = 1; map[2][3] = map[2][5] = map[2][6] = 1; map[3][4] = map[3][5] = map[3][6] = map[3][7] = 1; map[4][6] = map[4][7] = 1; map[5][6] = map[5][8] = 1; map[6][7] = map[6][6] = 1; map[7][8] = 1; } void input() { int t; for (int i = 1; i <= 8; i++) scanf("%d", &orinum[i]); } bool check() { for (int i = 1; i < 8; i++) { for (int j = i + 1; j <= 8; j++) if (map[i][j] && (num[i] - num[j] == 1 || num[j] - num[i] == 1)) return 0; } return 1; } void solve(int Case) { int cnt = 0; for (int i = 1; i <= 8; i++) num[i] = i; do { bool flag = 0; for (int i = 1; i <= 8; i++) if (orinum[i] && orinum[i] != num[i]) { flag = 1; break; } if (flag) continue; if (check()) { cnt++; memcpy(ans, num, sizeof(num)); } } while (next_permutation(num + 1, num + 9)); printf("Case %d: ", Case); if (!cnt) printf("No answer\n"); else if (cnt > 1) printf("Not unique\n"); else { for (int i = 1; i < 8; i++) printf("%d ", ans[i]); printf("%d\n", ans[8]); } } int main() { int T; scanf("%d", &T); init(); for (int i = 1; i <= T; i++) { input(); solve(i); } return 0; }
0 条评论