思路:暴搜,枚举每个位置的卡牌,直到找到结果为止。要注意的是合重,相同的卡牌合并在一起,记录数量,否则很容易超时。
#include<iostream>
using namespace std;
struct Node
{
int u,r,d,l,len;
}node[25];
int n,sum,tmp,tag;
int map[5][5];
void dfs(int index)
{
if(index==tmp)
{
tag=1;
return;
}
if(tag)
return;
int x=index/n,y=index%n;
for(int i = 0; i < sum; i++)
{
if(node[i].len==0)
continue;
if(x>0&&node[i].u!=node[map[x-1][y]].d||y>0&&node[i].l!=node[map[x][y-1]].r)
continue;
map[x][y]=i;
node[i].len--;
dfs(index+1);
if(tag)
return;
node[i].len++;
}
}
int main()
{
int cou= 0;
while(cin>>n&&n)
{
tag=0;
tmp=n*n;
sum=0;
int u,r,d,l;
for(int i = 0;i < 25; i++)
node[i].len=0;
for(int i = 0; i < tmp;i++)
{
cin>>u>>r>>d>>l;
int j;
for(j =0;j < sum;j++)
if(node[j].u==u&&node[j].r==r&&node[j].d==d&&node[j].l==l)
break;
if(j==sum)
{
node[j].u=u;
node[j].r=r;
node[j].d=d;
node[j].l=l;
node[j].len++;
sum++;
}
else
node[j].len++;
}
dfs(0);
if(cou)
cout<<endl;
cou++;
cout<<"Game "<<cou<<": ";
if(tag)
cout<<"Possible"<<endl;
else
cout<<"Impossible"<<endl;
}
return 0;
}