zoj 1008

水题。不解释。

#include<iostream>
#include<stdio.h>
using namespace std;
struct node{
	int top;
	int right;
	int bottom;
	int left;
	int sum;
};
node ko[26];
int cun[26];
int n,count,isok;
void dfs(int k)
{
	if(isok==1)
		return ;
	if(k==n*n)
	{
		isok=1;
		return;
	}
	int j;
	for(j=1;j<=count;j++)
	{
		if(ko[j].sum==0)
			continue;
		if(k==0)
		{
			cun[k]=j;
			ko[j].sum=ko[j].sum-1;
			dfs(k+1);
			ko[j].sum=ko[j].sum+1;
		}
		else if(k/n==0&&ko[j].left==ko[cun[k-1]].right)
		{
			cun[k]=j;
			ko[j].sum=ko[j].sum-1;
			dfs(k+1);
			ko[j].sum=ko[j].sum+1;
		}
		else if(k%n==0&&ko[j].top==ko[cun[k-n]].bottom)
		{
			cun[k]=j;
			ko[j].sum=ko[j].sum-1;
			dfs(k+1);
			ko[j].sum=ko[j].sum+1;
		}
		else if((k%n)!=0&&(k/n)!=0&&ko[j].left==ko[cun[k-1]].right&&ko[j].top==ko[cun[k-n]].bottom)
		{
			cun[k]=j;
			ko[j].sum=ko[j].sum-1;
			dfs(k+1);
			ko[j].sum=ko[j].sum+1;
		}
	}
	return;
}
int main()
{
	int i,a,b,c,d,j,all;
	all=0;
	while(cin>>n)
	{
		if(n==0)
			break;
		count=0;
		for(i=1;i<=n*n;i++)
		{
			scanf("%d%d%d%d",&a,&b,&c,&d);
			int ok=0;
			for(j=1;j<=count;j++)
				if(ko[j].top==a&&ko[j].right==b&&ko[j].bottom==c&&ko[j].left==d)
				{
					ko[j].sum=ko[j].sum+1;
					ok=1;
					break;
				}
			if(ok==0)
			{
				count=count+1;
				ko[count].top=a;
				ko[count].right=b;
				ko[count].bottom=c;
				ko[count].left=d;
				ko[count].sum=1;
			}
		}
		isok=0;
		if(all!=0)
			cout<<endl;
		all=all+1;
		cout<<"Game "<<all<<": ";
		dfs(0);
		if(isok==1)
			cout<<"Possible"<<endl;
		else cout<<"Impossible"<<endl;
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值