最短路简单的一维bfs题,不能dfs,dfs会超时。
记录路径的时候可以先记住每个点的前一个点,bfs跑到出口后往回找到起点输出就行了。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <stack> #include <queue> using namespace std; typedef struct zb { int x, y, nx, ny; }node; stack<node>a; stack<node>b; queue<node>q; int map[9][9], v[9][9]; void bfs(int x, int y) { node n, m; n.x = x; n.y = y; a.push(n); q.push(n); v[x][y] = 1; while(!q.empty()) { n = q.front(); q.pop(); if(n.x + 1 < 5 && !map[n.x + 1][n.y] && !v[n.x + 1][n.y]) { m.x = n.x + 1; m.y = n.y; m.nx = n.x; m.ny = n.y; q.push(m); a.push(m); v[m.x][m.y] = 1; if(m.x == 4 && m.y == 4) break; } if(n.x - 1 >= 0 && !map[n.x - 1][n.y] && !v[n.x - 1][n.y]) { m.x = n.x - 1; m.y = n.y; m.nx = n.x; m.ny = n.y; q.push(m); a.push(m); v[m.x][m.y] = 1; if(m.x == 4 && m.y == 4) break; } if(n.y + 1 < 5 && !map[n.x][n.y + 1] && !v[n.x][n.y + 1]) { m.x = n.x; m.y = n.y + 1; m.nx = n.x; m.ny = n.y; q.push(m); a.push(m); v[m.x][m.y] = 1; if(m.x == 4 && m.y == 4) break; } if(n.y - 1 >= 0 && !map[n.x][n.y - 1] && !v[n.x][n.y - 1]) { m.x = n.x; m.y = n.y - 1; m.nx = n.x; m.ny = n.y; q.push(m); a.push(m); v[m.x][m.y] = 1; if(m.x == 4 && m.y == 4) break; } } m = a.top(); a.pop(); b.push(m); while(!a.empty()) { while(!a.empty()) { n = a.top(); a.pop(); if(m.nx == n.x && n.y == m.ny) { b.push(n); break; } } m = n; } while(!b.empty()) { m = b.top(); b.pop(); printf("(%d, %d)\n",m.x,m.y); } } int main() { int i, j; for(i = 0;i < 5;i++) { for(j = 0;j < 5;j++) { cin>>map[i][j]; } } bfs(0,0); return 0; }