hdu 2514 Another Eight Puzzle

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2514

 

就是DFS+回溯。。。我蠢蠢的把所有状态枚举了。。

但是在输出处理上没注意。。。WA了几次

 

下面是AC代码:

#include<iostream>
#include<cstring>
using namespace std;
int a[10],b[10];
int mark[10];
int flag;
int judge(int num,int n)
{
	if(n==1&&num==2)
		return 1;
	if(n==8&&num==7)
		return 1;

	if((n>1&&n<8)&&(num==(n-1)||num==(n+1)))
			return 1;
		
		return 0;
}
int cheak(int pos ,int n)
{
	int i;
	if(pos==1)
	{
		for(i=2;i<=4;i++)
			if(judge(a[i],n))	return 0;
			return 1;
	}
	if(pos==2)
	{
		if(judge(a[1],n))     return 0;
		if(judge(a[3],n))     return 0;
		if(judge(a[5],n))     return 0;
		if(judge(a[6],n))     return 0;
		return 1;
	}
	
	if(pos==3)
	{
		if(judge(a[1],n))     return 0;
		if(judge(a[2],n))     return 0;
		for(i=4;i<=7;i++)
			if(judge(a[i],n))	return 0;
			return 1;
	}
	
	if(pos==4)
	{
		if(judge(a[1],n))     return 0;
		if(judge(a[3],n))     return 0;
		for(i=6;i<=7;i++)
			if(judge(a[i],n))	return 0;
			return 1;
	}
	
	if(pos==5)
	{
		if(judge(a[2],n))     return 0;
		if(judge(a[3],n))     return 0;
		
		if(judge(a[6],n))     return 0;
		if(judge(a[8],n))     return 0;
		return 1;
	}
	if(pos==6)
	{
		for(i=2;i<=5;i++)
			if(judge(a[i],n))	return 0;
			return 1;
			for(i=7;i<=8;i++)
				if(judge(a[i],n))	return 0;
				return 1;
	}
	if(pos==7)
	{
		if(judge(a[3],n))     return 0;
		if(judge(a[4],n))     return 0;
		if(judge(a[6],n))     return 0;
		if(judge(a[8],n))	return 0;
		return 1;
	}
	
	if(pos==8)
	{
		for(i=5;i<=6;i++)
			if(judge(a[i],n))	return 0;
			return 1;
	}
	
}
void DFS(int pos)
{
	int i;
	if(pos>8)
	{
		flag++;		
		for(i=1;i<=8;i++)
			b[i]=a[i];
		return ;
	}
	if(a[pos]==0)
	{
		for( i=1;i<=8;i++)
		{
			if(!mark[i]&&cheak(pos,i))
			{
				mark[i]=1;
				a[pos]=i;
				DFS(pos+1);
				mark[i]=0;
				a[pos]=0;
			}
		}
	}
	else
		DFS(pos+1);
}
int main()
{
	int t,i,j;
	cin>>t;
	
	for(j=1;j<=t;j++)
	{
		memset(mark,0,sizeof(mark));
		for(i=1;i<=8;i++)
		{
			cin>>a[i];
			mark[a[i]]=1;
		}
		flag=0;
		
		DFS(1);
		
		if(!flag)
		{
			printf("Case %d: ",j);
			printf("No answer\n");
		}
		else if(flag>1)
		{
			printf("Case %d: ",j);
			printf("Not unique\n");
		}
		else
		{
			printf("Case %d: ",j);
			printf("%d",b[1]);
			for(i=2;i<=8;i++)
				printf(" %d",b[i]);
			printf("\n");
		}
	}
	return 0;
	
}


 

你可能感兴趣的:(hdu 2514 Another Eight Puzzle)