#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int box[25][4],f[25][4],icon[25];
int n,qcur;
bool ans;
void dfs(int cur){
if(cur==n*n||ans){ //没有判断ans为真时返回,导致狂TLE,打击深重
ans=1;
return;
}
int i;
if(cur<n){
for(i=0;i<qcur;i++)
if((icon[i]>0&&cur==0)||(icon[i]>0&&box[i][3]==f[cur-1][1])){
f[cur][0]=box[i][0];f[cur][1]=box[i][1];
f[cur][2]=box[i][2];f[cur][3]=box[i][3];
icon[i]--;
dfs(cur+1);
icon[i]++;
}
}
else if(cur%n==0){
for(i=0;i<qcur;i++)
if(icon[i]>0&&box[i][0]==f[cur-n][2]){
f[cur][0]=box[i][0];f[cur][1]=box[i][1];
f[cur][2]=box[i][2];f[cur][3]=box[i][3];
icon[i]--;
dfs(cur+1);
icon[i]++;
}
}
else{
for(i=0;i<qcur;i++)
if(icon[i]>0&&box[i][0]==f[cur-n][2]&&box[i][3]==f[cur-1][1]){
f[cur][0]=box[i][0];f[cur][1]=box[i][1];
f[cur][2]=box[i][2];f[cur][3]=box[i][3];
icon[i]--;
dfs(cur+1);
icon[i]++;
}
}
}
int main(){
int i,j;
int game=0;
int top,right,bottom,left;
while(scanf("%d",&n)&&n!=0){
memset(icon,0,sizeof(icon));
ans=0;
qcur=0;
for(i=0;i<n*n;i++){
scanf("%d%d%d%d",&top,&right,&bottom,&left);
for(j=0;j<qcur;j++)
if(box[j][0]==top&&box[j][1]==right&&box[j][2]==bottom&&box[j][3]==left){
icon[j]++;
break;
}
if(j==qcur){
box[j][0]=top;box[j][1]=right;box[j][2]=bottom;box[j][3]=left;
icon[j]=1;
qcur++;
}
}
dfs(0);
if(game>0) printf("\n");
if(ans)
printf("Game %d: Possible\n",++game);
else
printf("Game %d: Impossible\n",++game);
}
return 0;
}
zoj1008-gnome tetravex
最新推荐文章于 2019-11-10 14:53:51 发布