1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
首先有坑的地方是friends,对嘛,朋友有很多,angel只有一个。所以更好的处理办法就是以angel为起点。 其次是杀死guard并走到其位置上需要2mins,这样就违背了BFS等距离向外扩展的原理 所以用队列的话,可以把杀死guard和走到其位置上看成两个步骤,入队两次。 优先队列就简单了,直接以时间从小到大建立优先级就好了。 下面给出优先队列代码 #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<queue> using namespace std; int n , m; int dx[]= {0,0,1,-1}; int dy[]= {1,-1,0,0}; char s[205][205]; typedef struct p { int x,y,t; bool operator < (const p & a) const //运算符重载,自定义优先级 { return t>a.t; //取时间最少优先 } } Point; int BFS(int x , int y) { priority_queue<Point> Q; //优先队列 Point in ,out; in .x = x; in .y = y; in .t = 0; s[x][y] = '#' ; Q.push( in ); while (!Q.empty()) { in = Q.top(); Q.pop(); for (int i= 0 ; i < 4; i++) { int xx = in .x + dx[i]; int yy = in .y + dy[i]; if (xx < 0 || xx == n || yy < 0 || yy == m || s[xx][yy] == '#' ) continue ; if (s[xx][yy]== 'r' ) return in .t+1; if (s[xx][yy] == '.' ) { s[xx][yy] = '#' ; out.x = xx; out.y = yy; out.t = in .t + 1; } else if (s[xx][yy]== 'x' ) { s[xx][yy] = '#' ; out.x = xx; out.y = yy; out.t = in .t + 2; } Q.push(out); } } return -1; } int main() { while (scanf( "%d%d" ,&n,&m)!=EOF) { int x , y ; for (int i = 0 ; i < n; i++) { scanf( "%s" ,s[i]); for (int j = 0 ; j <m; j++) if (s[i][j]== 'a' ) { x = i; y = j; } } int time = BFS(x,y); if (time==-1) printf( "Poor ANGEL has to stay in the prison all his life.\n" ); else printf( "%d\n" ,time); } return 0; } |
ZOJ 1649 解题报告
最新推荐文章于 2019-07-07 04:49:19 发布