HDU 2514 Another Eight Puzzle

地址:http://acm.hdu.edu.cn/showproblem.php?pid=2514

题意:每两个相连的点差要大于1。


思路:之前用我是一个点一个点的判断,但是老是错了,最后想了想还是要八个点一起判断。

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
int Map[8][8] = {
	{ 0, 1, 1, 1, 0, 0, 0, 0 },
	{ 1, 0, 1, 0, 1, 1, 0, 0 },
	{ 1, 1, 0, 1, 1, 1, 1, 0 },
	{ 1, 0, 1, 0, 0, 1, 1, 0 },
	{ 0, 1, 1, 0, 0, 1, 0, 1 },
	{ 0, 1, 1, 1, 1, 0, 1, 1 },
	{ 0, 0, 1, 1, 0, 1, 0, 1 },
	{ 0, 0, 0, 0, 1, 1, 1, 0 } };
int visit[10], in[10], ans[10];   // 搜索标记、输入、答案
int sign;    // sign==1时的输入数组直接用in[]
int ABS(int x){
	if (x >= 0)
		return x;
	return -x;
}
int ok()                                // 判断当前搜索的一组是否符合
{
	for (int i = 0; i < 8; i++)
	for (int j = 0; j < 8; j++)
	if (Map[i][j] && ABS(in[i] - in[j]) == 1)
		return 0;
	return 1;
}
void dfs(int a)
{
	if (a == 8 && ok()){
		sign++;
		for (int i = 0; i<8; i++){
			ans[i] = in[i];
		}
	}
	if (sign > 1)
		return;
	if (in[a] != 0)
		dfs(a + 1);
	for (int i = 1; i <= 8; i++)
	{
		if (!visit[i]){
			visit[i] = 1;
			in[a] = i;
			dfs(a + 1);
			in[a] = 0;
			visit[i] = 0;
		}
	}
}
int main()
{
	int t, Case = 0;
	scanf("%d", &t);
	while (t--)
	{
		memset(visit, 0, sizeof(visit));
		for (int i = 0; i < 8; i++){
			scanf("%d", &in[i]);
			visit[in[i]] = 1;
		}
		sign = 0;
		dfs(0);
		printf("Case %d: ", ++Case);
		if (sign == 0)
			puts("No answer");
		else if (sign == 1){
			for (int i = 0; i < 7; i++)
				printf("%d ", ans[i]);
			printf("%d\n", ans[7]);
		}
		else
			puts("Not unique");
	}
	return 0;
}


你可能感兴趣的:(C++,c,搜索,ACM,DFS)