码迷,mamicode.com
首页 > 其他好文 > 详细

[ZOJ 1008]Gnome Tetravex (dfs搜索 + 小优化)

时间:2014-11-13 14:12:55      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   sp   for   

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008

题目大意:给你n*n的矩阵,每个格子里有4个三角形,分别是上右下左,每个三角形里面标记了数字,问你能否通过移动这n*n个格子,使得相邻两个三角形具有相同的数字?

 

dfs暴搜,dfs(x,y)代表当前要放(x,y)这个位置。

然后枚举给定的每个格子。

如果说可以放,就dfs下一个格子。

 

这一道题需要把相同的格子压缩起来,也就是说为了节省时间,可以记录相同的格子出现的次数。

然后对于这不同种的格子去dfs。

如果不这样做会超时。

 

这算是一种优化方法吧。涨姿势了。

 

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <string>
 4 #include <iostream>
 5 #include <cstring>
 6 #include <algorithm>
 7 #include <cctype>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <iterator>
12 #include <functional>
13 #include <cmath>
14 #include <numeric>
15 #include <ctime>
16 using namespace std;
17 typedef long long LL;
18 typedef pair<int,int> PII;
19 typedef vector<int> VI;
20 #define PB push_back
21 #define MP make_pair
22 #define SZ size()
23 #define CL clear()
24 #define AA first
25 #define BB second
26 #define EPS 1e-8
27 #define ZERO(x) memset((x),0,sizeof(x))
28 const int INF = ~0U>>1;
29 const double PI = acos(-1.0);
30 
31 int n;
32 int now[10][10];
33 bool vis[100];
34 int ptr;
35 bool flag;
36 
37 struct Node{
38     int top,right,bottom,left;
39     int num;
40     bool operator==(const Node& b) const{
41         return top==b.top&&right==b.right&&bottom==b.bottom&&left==b.left;
42     }
43     Node(int t=0,int r=0,int b=0,int l=0):top(t),right(r),bottom(b),left(l){}
44 };
45 Node mp[100];
46 
47 void dfs(int x,int y){
48     if(flag) return;
49     if( x==n || y==n ){
50         flag = true;
51         return;
52     }
53     for(int i=0;i<ptr;i++){
54         if( mp[i].num&&
55            (x==0||mp[now[x-1][y]].bottom==mp[i].top)
56            &&(y==0||mp[now[x][y-1]].right==mp[i].left) ){
57                 now[x][y] = i;
58                 mp[i].num--;
59                 if( y+1<n ) dfs(x,y+1);
60                 else dfs(x+1,0);
61                 mp[i].num++;
62            }
63     }
64 }
65 
66 int main(){
67     int kase = 1;
68     while(scanf("%d",&n),n){
69         ptr = 0;
70         for(int i=0;i<n*n;i++){
71             int t,r,b,l;
72             scanf("%d%d%d%d",&t,&r,&b,&l);
73             bool appear = 0;
74             for(int j=0;j<ptr;j++){
75                 if(Node(t,r,b,l)==mp[j]){
76                     mp[j].num++;
77                     appear = 1;
78                 }
79             }
80             if(!appear){
81                 mp[ptr] = Node(t,r,b,l);
82                 mp[ptr++].num = 1;
83             }
84         }
85 
86         flag = false;
87         dfs(0,0);
88 
89         if(kase!=1) puts("");
90         printf("Game %d: ",kase++);
91         puts(flag?"Possible":"Impossible");
92     }
93     return 0;
94 }

 

[ZOJ 1008]Gnome Tetravex (dfs搜索 + 小优化)

标签:style   blog   http   io   color   ar   os   sp   for   

原文地址:http://www.cnblogs.com/llkpersonal/p/4094731.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!