BFS 模板 Fire! UVA - 11624

BFS 广度优先搜索和DFS差别只是增加了一个进入队列的过程 

人和火同步更新

 

 

 1 struct point{
 2     int x, y, steps;
 3     point(int a, int b, int c) { x = a; y = b; steps = c; }
 4 };
 5 char maze[maxn][maxn];
 6 int n, m;
 7 int xd[4] = { 0,0,1,-1 };
 8 int yd[4] = { 1,-1,0,0 };
 9 
10 deque<point>fire;
11 deque<point>joe;
12 
13 int BFS() {
14     fire.clear();
15     joe.clear();
16     //预处理
17     for (int i = 0; i < n; i++) {
18         for (int j = 0; j < m; j++) {
19             if (maze[i][j] == 'F') {
20                 maze[i][j] = '#';
21                 fire.push_back(point(i, j, 0));
22             }
23             else if (maze[i][j] == 'J')
24             {
25                 maze[i][j] = '#';
26                 joe.push_back(point(i, j, 0));
27             }
28         }
29     }
30     int nj = 0, nf = 0;
31     while (!joe.empty()) {
32         // 火蔓延一步,把所有蔓延到火的格子标记
33         while (!fire.empty()) {
34             point f = fire.front();
35             if (f.steps == nf) {
36                 fire.pop_front();
37                 for (int i = 0; i < 4; i++) {
38                     int a = f.x + xd[i], b = f.y + yd[i];
39                     if (a < n && b < m && a >= 0 && b >= 0 && maze[a][b] != '#')
40                     {
41                         maze[a][b] = '#';
42                         fire.push_back(point(a, b, nf + 1));
43                     }
44                 }
45             }
46             else {
47                 //nf++;
48                 break;
49             }
50         }
51 
52         // 人走一步,把所有可能走到的格子标记
53         while (!joe.empty()) {
54             point j = joe.front();
55             if (j.steps == nf) {
56                 joe.pop_front();
57                 for (int i = 0; i < 4; i++) {
58                     int a = j.x + xd[i], b = j.y + yd[i];
59                     if (a >= n || a < 0 || b >= m || b < 0)
60                         return nf + 1;
61                     if (maze[a][b] != '#')
62                     {
63                         maze[a][b] = '#';
64                         joe.push_back(point(a, b, nf + 1));
65                     }
66                 }
67             }
68             else {
69                 nf++;
70                 break;
71             }
72         }
73     }
74     return -1;
75 }
View Code

 

posted @ 2020-11-13 10:35  Aboicde  阅读(19)  评论(0)    收藏  举报