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

【HDOJ】1180 诡异的楼梯

时间:2014-06-03 13:26:06      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

bfs+优先队列。wa了N次,才发现可以停留等待楼梯变换方向。

bubuko.com,布布扣
 1 #include <iostream>
 2 #include <queue>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 #define MAXNUM 55
 8 
 9 typedef struct node_st {
10     int x, y, t;
11     node_st() {}
12     node_st(int xx, int yy, int tt) {
13         x = xx; y = yy; t = tt;
14     }
15     friend bool operator < (node_st a, node_st b) {
16         return a.t > b.t;
17     }
18 } node_st;
19 
20 char map[MAXNUM][MAXNUM];
21 char visit[MAXNUM][MAXNUM];
22 int n, m;
23 int begx, begy, endx, endy;
24 int direct[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
25 
26 int bfs(int begx, int begy) {
27     priority_queue<node_st> que;
28     node_st node;
29     int i, x, y, nx, ny, t;
30 
31     que.push(node_st(begx, begy, 0));
32     memset(visit, 0, sizeof(visit));
33     visit[begx][begy] = 1;
34 
35     while ( !que.empty() ) {
36         node = que.top();
37         if (map[node.x][node.y] == T) {
38             return node.t;
39         }
40         que.pop();
41         for (i=0; i<4; ++i) {                
42             x = node.x + direct[i][0];
43             y = node.y + direct[i][1];
44             if (x<0 || x>=n || y<0 || y>=m)
45                 continue;
46             if (visit[x][y] || map[x][y] == *)
47                 continue;
48             if (map[x][y] == . || map[x][y]==T) {
49                 que.push(node_st(x,y,node.t+1));
50                 visit[x][y] = 1;
51                 continue;
52             }
53             if (map[x][y]==| || map[x][y]==-) {
54                 nx = x + direct[i][0];
55                 ny = y + direct[i][1];
56                 t = node.t + 1;
57                 if (nx<0 || nx>=n || ny<0 || ny>=m)
58                     continue;
59                 if (visit[nx][ny] || map[nx][ny]==*)
60                     continue;
61                 if ( ((map[x][y]==|) && ((node.t&1)==0) && (i==2||i==3)) ||
62                      ((map[x][y]==|) && ((node.t&1)!=0) && (i==0||i==1)) ||
63                      ((map[x][y]==-) && ((node.t&1)==0) && (i==0||i==1)) ||
64                      ((map[x][y]==-) && ((node.t&1)!=0) && (i==2||i==3)) )
65                      ++t;
66                 visit[nx][ny] = 1;
67                 que.push(node_st(nx, ny, t));
68             }
69         }
70     }
71 
72     return -1;
73 }
74 
75 int main() {
76     int i, j;
77 
78     while (scanf("%d %d%*c",&n,&m) != EOF) {
79         for (i=0; i<n; ++i) {
80             scanf("%s", map[i]);
81             for (j=0; j<m; ++j) {
82                 if (map[i][j] == S) {
83                     begx = i;
84                     begy = j;
85                 }
86             }
87         }
88         i = bfs(begx, begy);
89         printf("%d\n", i);
90     }
91 
92     return 0;
93 }
bubuko.com,布布扣

 

【HDOJ】1180 诡异的楼梯,布布扣,bubuko.com

【HDOJ】1180 诡异的楼梯

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/bombe1013/p/3759766.html

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