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编辑  收藏  举报

导航