zoj 1008 Gnome Tetravex
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=8
解题思路:DFS搜索
1 /////////////////////////////////////////////////////////////////////////// 2 //problem_id: zoj 1008 3 //user_id: SCNU20102200088 4 /////////////////////////////////////////////////////////////////////////// 5 6 #include <algorithm> 7 #include <iostream> 8 #include <iterator> 9 #include <iomanip> 10 #include <cstring> 11 #include <cstdlib> 12 #include <string> 13 #include <vector> 14 #include <cstdio> 15 #include <cctype> 16 #include <cmath> 17 #include <queue> 18 #include <stack> 19 #include <list> 20 #include <set> 21 #include <map> 22 using namespace std; 23 24 /////////////////////////////////////////////////////////////////////////// 25 typedef long long LL; 26 const double PI=acos(-1.0); 27 /////////////////////////////////////////////////////////////////////////// 28 29 /////////////////////////////////////////////////////////////////////////// 30 //Add Code: 31 int n,cnt,a[30][5],b[10][10][5],num[30]; 32 33 bool DFS(int i,int j){ 34 if(i==n && j==n) return 1; 35 int u,v; 36 if(j==n){ 37 i++,j=1; 38 for(u=1;u<cnt;u++){ 39 if(num[u]>0 && a[u][0]==b[i-1][j][2]){ 40 num[u]--; 41 for(v=0;v<4;v++) b[i][j][v]=a[u][v]; 42 if(DFS(i,j)) return 1; 43 num[u]++; 44 } 45 } 46 } 47 else if(i==1){ 48 for(u=1;u<cnt;u++){ 49 if(num[u]>0 && a[u][3]==b[i][j][1]){ 50 num[u]--; 51 for(v=0;v<4;v++) b[i][j+1][v]=a[u][v]; 52 if(DFS(i,j+1)) return 1; 53 num[u]++; 54 } 55 } 56 } 57 else{ 58 for(u=1;u<cnt;u++){ 59 if(num[u]>0 && a[u][3]==b[i][j][1] && a[u][0]==b[i-1][j+1][2]){ 60 num[u]--; 61 for(v=0;v<4;v++) b[i][j+1][v]=a[u][v]; 62 if(DFS(i,j+1)) return 1; 63 num[u]++; 64 } 65 } 66 } 67 return 0; 68 } 69 /////////////////////////////////////////////////////////////////////////// 70 71 int main(){ 72 /////////////////////////////////////////////////////////////////////// 73 //Add code: 74 int Case=1,i,j,k,x[4]; 75 while(scanf("%d",&n)!=EOF){ 76 if(n==0) break; 77 cnt=1; 78 memset(num,0,sizeof(num)); 79 for(i=1;i<=n*n;i++){ 80 for(j=0;j<4;j++) scanf("%d",&x[j]); 81 bool yes=0; 82 for(j=1;j<cnt;j++){ 83 bool judge=1; 84 for(k=0;k<4;k++){ 85 if(a[j][k]!=x[k]){ 86 judge=0; 87 break; 88 } 89 } 90 if(judge){ 91 yes=1; 92 break; 93 } 94 } 95 if(yes) num[j]++; 96 else{ 97 for(j=0;j<4;j++) a[cnt][j]=x[j]; 98 num[cnt]++; 99 cnt++; 100 } 101 } 102 bool flag=0; 103 for(i=1;i<cnt;i++){ 104 num[i]--; 105 for(j=0;j<4;j++) b[1][1][j]=a[i][j]; 106 if(DFS(1,1)){ 107 flag=1; 108 break; 109 } 110 num[i]++; 111 } 112 if(Case>1) printf("\n"); 113 printf("Game %d: ",Case++); 114 if(flag) printf("Possible\n"); 115 else printf("Impossible\n"); 116 } 117 /////////////////////////////////////////////////////////////////////// 118 return 0; 119 } 120 121 /////////////////////////////////////////////////////////////////////////// 122 /* 123 Testcase: 124 Input: 125 2 126 5 9 1 4 127 4 4 5 6 128 6 8 5 4 129 0 4 4 3 130 2 131 1 1 1 1 132 2 2 2 2 133 3 3 3 3 134 4 4 4 4 135 0 136 Output: 137 Game 1: Possible 138 139 Game 2: Impossible 140 */ 141 ///////////////////////////////////////////////////////////////////////////
posted on 2013-08-18 20:19 SCNU20102200088 阅读(161) 评论(0) 编辑 收藏 举报