/* 现将相同的合并计数。 再枚举判断是否符合当cou==n*n是符合就退出 */ #include<stdio.h> #include<string.h> #define N 900 int en[N][4],num[N],real[N][4],len,n,ok; void pp(int a[4],int b[4])//赋值 { a[0]=b[0]; a[1]=b[1]; a[2]=b[2]; a[3]=b[3]; } void print(int a[4]) { printf("%d %d %d %d ",a[0],a[1],a[2],a[3]); } void dfs(int cou) { // printf("%d ",cou); // if(cou) // print(en[cou]); if(cou==n*n) { ok=1; return ; } if(ok)return ; int i; for(i=0;i<len; i++) { if(num[i]==0)continue; if((cou%n==0||en[cou][1]==real[i][3])&&(cou/n==0||en[cou+1-n][2]==real[i][0])) {//注意判断条件对于优化程序很好 pp(en[cou+1],real[i]); num[i]-=1; dfs(cou+1); num[i]+=1; } } return ; } int main() { int i,k=0,w=0,a,b,c,j,d; while(scanf("%d",&n),n) { ok=0; memset(num,0,sizeof(num)); len=0; for(i=1; i<=n*n; i++) { scanf("%d%d%d%d",&a,&b,&c,&d); for(j=0;j<len;j++) if(a==real[j][0]&&b==real[j][1]&&c==real[j][2]&&d==real[j][3]) break; if(j<len) num[j]++; if(j==len) { real[len][0]=a;real[len][1]=b; real[len][2]=c;real[len][3]=d; num[len++]=1; } }//这里需要这样储存相同的,感觉有点坑啊 ,原来我的是先储存下来在合并合同的但是chaoshi,改成这样就不超时ile if(w) printf(" "); dfs(0); if(ok) printf("Game %d: Possible ",++k); else printf("Game %d: Impossible ",++k); w=1; } return 0; }