http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=8
我做此题错了好几次,纠结了还几天,今天总算弄懂了自己的逻辑错误,又学到了一些新的知识
一下时我的代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; int t; const int sizen=36; struct ele { int up; int right; int down; int left; }p[sizen]; int result[sizen]; int cnt[sizen]; int DFS(int x,int n) { int i; if(x==n*n) return 1; for(i=0;i<t;i++) { if(!cnt[i]) continue; if(x%n!=0) if(p[i].left!=p[result[x-1]].right) continue; if(x/n!=0) if(p[i].up!=p[result[x-n]].down) continue; cnt[i]--; result[x]=i; if(DFS(x+1,n)) return 1; cnt[i]++; } return 0; } int main() { int n; int q=0; int i,j; int x1,x2,x3,x4; bool s=false; while(scanf("%d",&n),n) { t=0; memset(cnt,0,sizeof(cnt)); for(i=0;i<n*n;i++) { scanf("%d%d%d%d",&x1,&x2,&x3,&x4); for(j=0;j<t;j++) if(p[j].up==x1&&p[j].right==x2&&p[j].down==x3&&p[j].left==x4) { cnt[j]++; break; } if(j==t) { p[t].up=x1; p[t].right=x2; p[t].down=x3; p[t].left=x4; cnt[t]++; t++; } } if(!s) s=true; else printf("\n"); printf("Game %d: ",++q); if(DFS(0,n)) printf("Possible\n"); else printf("Impossible\n"); } return 0; }