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

 

分类: ACM/ICPC

发表评论

电子邮件地址不会被公开。 必填项已用*标注