一道不算难的DFS题,但是这个题要注意下其测试数据存在重复方块,如果不考虑去重的情况就会超时。另外换行符不能多输出,Game 1: 分号后面还有一个空格~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=30;
struct node
{
int top;
int buttom;
int left;
int right;
int num;
bool operator == (const node& a)const
{
if(top==a.top&&buttom==a.buttom&&left==a.left&&right==a.right)
return true;
return false;
}
}a[30];
int n,m,dex[maxn][maxn];
bool ans;
void DFS(int now)
{
if(ans)
return ;
if(now==n*n)
{
ans=true;
return ;
}
int x=now/n;
int y=now%n;
for(int i=0;i<m;i++)
{
if(!a[i].num)
continue;
if(x>0&&a[i].top!=a[dex[x-1][y]].buttom)
continue;
if(y>0&&a[i].left!=a[dex[x][y-1]].right)
continue;
a[i].num--;
dex[x][y]=i;
DFS(now+1);
if(ans)
return;
a[i].num++;
}
}
int main()
{
int cas=1;
while(scanf("%d",&n)&&n)
{
ans=m=false;
for(int i=0;i<n*n;i++)
{
scanf("%d%d%d%d",&a[i].top,&a[i].right,&a[i].buttom,&a[i].left);
a[i].num=1;
bool find=0;
for(int j=0;j<m;j++)
if(a[i]==a[j])
{
a[j].num++;
find=1;
break;
}
if(!find)
a[m++]=a[i];
}
DFS(0);
if(cas>1)
printf("\n");
printf("Game %d: ",cas++);
if(ans)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}