#include<stdio.h> int n,q; int jk[25][4]; int state[25]; int result[25]; void initial() { int i,j; for(i=0; i<25; i++) { for(j=0; j<4; j++) jk[i][j]=0; state[i]=0; result[i]=0; } q=0; } int dfs(int ipos) { int i; if(ipos==n*n) return 1; else { for(i=0; i<q; i++) { if(state[i]==0) continue; else { if(ipos>=n&&jk[result[ipos-n]][2]!=jk[i][0]) continue; // 如果有前一行,且前一行的正方形的下边与其的上边不相等,跳过。 if(ipos%n!=0&&jk[result[ipos-1]][1]!=jk[i][3]) continue; //如果有前一排,且前一排的正方形的右边与其的左边不相等,跳过。 state[i]--; result[ipos]=i; if(dfs(ipos+1)==1) return 1; state[i]++; } } } return 0; } int main() { //freopen("input.txt","r",stdin); int i,j,index; index=0; int top,right,bottom,left; scanf("%d",&n); while(n) { initial(); index++; for(i=0; i<n*n; i++) { scanf("%d %d %d %d",&top,&right,&bottom,&left); for(j=0; j<q; j++) { if(jk[j][0]==top&&jk[j][1]==right&&jk[j][2]==bottom&&jk[j][3]==left) { state[j]++; break; } } if(j==q) { jk[q][0]=top; jk[q][1]=right; jk[q][2]=bottom; jk[q][3]=left; state[q]=1; q++; } } if(index>1) printf("\n"); printf("Game %d: ",index); if(dfs(0)) printf("Possible\n"); else printf("Impossible\n"); scanf("%d",&n); } return 0; }