#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXNUM 26
typedef struct{
int l,r,u,d; // 代表左右上下。
}data;
data Squres[MAXNUM];
int SquresNum[MAXNUM],FillSqures[MAXNUM],TestNum,Line,All;
bool Judge(data Temp,data Compare){
if(Temp.d==Compare.d && Temp.l==Compare.l
&& Temp.r==Compare.r && Temp.u==Compare.u)
return true;
return false;
}
void Input(){
All=0;
fill_n(SquresNum,MAXNUM,0);
for(int i=0,j ;i<Line*Line;i++){
data Temp;
cin>>Temp.u>>Temp.r>>Temp.d>>Temp.l;
for(j=0;j<All;j++){
if( Judge(Temp,Squres[j]) ){ //方块是否已经存在,存在可不添加,数量加1
SquresNum[j]++;
break;
}
}
if(j==All)
Squres[All]=Temp,SquresNum[All++]=1;
}
}
bool Solve(int Locate){
if(Locate==Line*Line)
return true;
int x=Locate/Line,y=Locate%Line;
for(int i=0;i<All;i++){
if(SquresNum[i]==0)
continue;
if(x>0 && Squres[FillSqures[Locate-Line]].d!=Squres[i].u )
//它是第一行或者上一个方块的下面与它的上面不相等
continue;
if(y>0 && Squres[FillSqures[Locate-1]].r!=Squres[i].l)
//它是第一列或者左边的方块的右边与它的左面不相等
continue;
FillSqures[Locate]=i; // 标志这个已经填好
SquresNum[i]--; //相同板块减去一个
if(Solve(Locate+1)) //搜索下一个
return true;
SquresNum[i]++; //如果下一个不合适了,回溯一个方块,就是加回刚才已经减掉的
}
return false;
}
int main(){
while(cin>>Line && Line ){
if(TestNum)
cout<<endl;
Input();
cout<<"Game "<<++TestNum<<": ";
puts(Solve(0)?"Possible":"Impossible");
}
return 0;
}
zju 1008 Gnome Tetravex
最新推荐文章于 2019-07-16 09:35:24 发布