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

Source

ECJTU 2008 Autumn Contest

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)
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;
}