昨天中午做的这道题,结果蛙了一整天,就因为一行代码困住了,今天算是见识到自己有多菜了。流泪.jpg
本题大意:给一个5 * 5的迷宫,1表示墙壁,0表示通路,从左上角走到右下角并输出路径。
本题思路:主要就是BFS寻路,为了方便打印,从右下角开始进行BFS。
注意输出时候的大坑,会有标记。
本题代码:
1 #include <cstdio> 2 #include <queue> 3 #include <map> 4 using namespace std; 5 6 typedef pair<int ,int > P; 7 const int n = 5, INF = 1e7; 8 int maze[n][n], d[n][n], dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}; 9 P path[n][n];//用来保存每个结点的父节点,方便输出 10 11 void bfs() { 12 queue <P> s; 13 s.push(P(4, 4));//从终点到起点方便路径打印 14 for(int i = 0; i < n; i ++) 15 for(int j = 0; j < n; j ++) { 16 d[i][j] = INF; 17 path[i][j] = P(-1, -1); 18 } 19 d[4][4] = 0; 20 while(s.size()) { 21 P p = s.front(); 22 if(p.first == 0 && p.second == 0) break; 23 s.pop(); 24 for(int i = 0; i < 4; i ++) { 25 int nx = p.first + dx[i], ny = p.second + dy[i]; 26 if(nx >= 0 && nx < n && ny >= 0 && ny < n && maze[nx][ny] == 0 && d[nx][ny] == INF) { 27 s.push(P(nx, ny)); 28 d[nx][ny] = d[p.first][p.second] + 1; 29 path[nx][ny] = P(p.first, p.second); 30 } 31 } 32 } 33 } 34 35 int main () { 36 for(int i = 0; i < n; i ++) 37 for(int j = 0; j < n; j ++) 38 scanf("%d", &maze[i][j]); 39 bfs(); 40 P p = make_pair(0, 0); 41 while(p.first != -1) { 42 printf("(%d, %d) ", p.first, p.second); 43 int tmp = p.first;//这个很坑,坑了我4个小时,修改值之前进行记录 44 p.first = path[p.first][p.second].first; 45 p.second = path[tmp][p.second].second; 46 } 47 return 0; 48 }