POJ-3984 迷宫问题

xiaoxiao2021-02-28  98

定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 Input 一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。 Output 左上角到右下角的最短路径,格式如样例所示。 Sample Input 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 Sample Output (0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)

最短路简单的一维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; }

转载请注明原文地址: https://www.6miu.com/read-53512.html

最新回复(0)