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 }

浙公网安备 33010602011771号