经典的DFS,注意使用map[MAX_NODE][MAX_NODE]保存地图:
#include<iostream>
#include<string>
using namespace std;
struct Node
{
int top,right,buttom,left;
bool operator==(const Node &temp)
{
return (temp.top==top && temp.right==right && temp.left==left && temp.buttom==buttom);
}
};
const int MAX_NODE=100;
Node node[MAX_NODE];
int sum[MAX_NODE];
bool flag;
int n;
int map[MAX_NODE][MAX_NODE];
void dfs(int p)
{
if(flag)
return;
if(p==n*n)
{
flag=true;
return;
}
int i;
int x=p/n,y=p%n;
for(i=0;i<n*n && flag==false;i++)
{
if(sum[i]) //是有效的node
{
if(x>0)
{
if(node[i].top!=node[map[x-1][y]].buttom)
continue;
}
if(y>0)
{
if(node[i].left!=node[map[x][y-1]].right)
continue;
}
map[x][y]=i;
sum[i]--;
dfs(p+1);
sum[i]++;
}
}
}
int main()
{
int cases=0;
while(cin>>n && n)
{
cases++;
flag=false;
fill(sum,sum+n*n,0);//注意如果sum[i]=0,说明前面有一样的出现过了
int i,j;
for(i=0;i<n*n;i++)
{
cin>>node[i].top>>node[i].right>>node[i].buttom>>node[i].left;
for(j=0;j<i;j++)
{
if(sum[j] && node[j]==node[i])
{
sum[j]++;
break;
}
}
if(j==i)
sum[i]=1;
}
fill(&map[0][0],&map[MAX_NODE-1][MAX_NODE-1],0);
dfs(0);
if(cases>1)
cout<<endl;
cout<<"Game "<<cases<<": ";
if(flag)
cout<<"Possible"<<endl;
else
cout<<"Impossible"<<endl;
}
return 0;
}