迷宫问题(BFS+保存路径) POJ No.3984

Description

定义一个二维数组:

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)分析:因为上一篇中的迷宫问题只需要输出最小步数一个整数,所以可以将用来表示访问过的状态数组和递增步数的数组合为一个整型二维数组。而这里需要记录的是路径,即每一步走过的坐标,所以可以另设一个自定义的数组用来存坐标,另设一个布尔类型数组表示访问状态。在后面遍历记录路径的数组时发现仍然需要最小步数来做判断条件,所以自定义了一个含x,y,z的类,z用来计算最小步数。关于保存路径:将已经访问过的状态用标记管理起来,就可以实现由近及远的搜索,从终点往回遍历foot一定是最短路径。你可以找一条比最短路径长的路径,然后分析路径上的特殊状态会发现,因为被访问过的状态不能再被访问,所以最长路径上的有些状态已经被短路径访问过,所以这条长路径会在这中断而不会到达终点,所以将已经访问过的状态用标记管理起来,就可以实现由近及远的搜索。代码如下:
#include <iostream>
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<set>
    #define INF 0x3f3f3f3f
    #define MAX 10

    using namespace std;

    struct node{
        int x, y, z;
    };
    int mp[MAX][MAX];
    node foot[MAX][MAX];
    int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
    bool visit[MAX][MAX];

    int bfs(){
        queue<node> que;
        que.push((node){
                 0,0,0
                 });
        while(!que.empty()){
            node p = que.front();
            que.pop();
            if(p.x == 4 && p.y == 4) return p.z;
            if(visit[p.x][p.y]) continue;
            for(int i = 0; i < 4; i++){
                node n;
                n.x = p.x + dx[i];
                n.y = p.y + dy[i];
                n.z = p.z + 1;
                if(0 <= n.x && n.x < 5 && 0 <= n.y && n.y < 5){
                    if(!visit[n.x][n.y] && !mp[n.x][n.y]){
                        que.push(n);
                        foot[n.x][n.y].x = p.x;
                        foot[n.x][n.y].y = p.y;
                    }
                }
            }
        }
        return 0;

    }

    int main(){
        memset(visit, false, sizeof(visit));
        for(int i = 0; i < 5; i++)
            for(int j = 0; j < 5; j++){
                scanf("%d", &mp[i][j]);
            }
        int len = bfs();
        int a = 4, b = 4;
        node arr[MAX];
        for(int i = 0; i < len; i++){
            arr[i].x = foot[a][b].x;
            arr[i].y = foot[a][b].y;
            a = arr[i].x;
            b = arr[i].y;
        }
        for(int i = len - 1; i >= 0; i--){
            printf("(%d, %d)\n", arr[i].x, arr[i].y);
        }
        printf("(4, 4)\n");
        return 0;
    }
 
时间: 2024-08-25 00:07:39

迷宫问题(BFS+保存路径) POJ No.3984的相关文章

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

HDU 1728 逃离迷宫(BFS)

Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可

HDU 1240——Asteroids!(三维BFS)POJ 2225——Asteroids

普通的三维广搜,需要注意的是输入:列,行,层 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #define M 11 using namespace std; int dir[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};//6个方向 int

迷宫问题 BFS入门水题

1102:迷宫问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:84 解决: 41 题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程. 小明只能向上下左右四个方向移动. 输入格式 输入包含多组测试数据.输入的第一行是一个整数T,表示有T组测试数据. 每组输入的第一行是两个整数N和M(1<=N,M<=100). 接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格. 字符的含义如下: 'S':起点 'E':终点 '-':空地,可以通过 '#':障碍,无法通

hdu 1728 逃离迷宫 (bfs+循环队列)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15248    Accepted Submission(s): 3681 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地

POJ 3984 迷宫问题 bfs 难度:0

http://poj.org/problem?id=3984 典型的迷宫问题,记录最快到达某个点的是哪个点即可 #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=10; const int inf=0x3fffffff; struct pnt { int x,y; pnt(){x=y=0;} pnt(int tx,int ty){x=tx,y

POJ 3984 迷宫问题 bfs

题目链接:迷宫问题 天啦撸.最近怎么了.小bug缠身,大bug 不断.然这是我大腿第一次给我dbug.虽然最后的结果是.我............bfs入队列的是now.............. 然后.保存路径的一种用的string .一种用的数组.大同小异.根据就是我bfs 先搜到的绝壁就是步数最少的. 附代码: pre 数组 1 /* 2 很简单的广搜.如果不是+路径输出的话.. 3 保存路径. 4 */ 5 6 #include <stdio.h> 7 #include <str

POJ 3984:迷宫问题(BFS+路径记录)

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7560   Accepted: 4426 Description 定义一个二维数组: 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表示可以走的路,只能横着走或竖着走,不能斜着走,要

POJ - 3984 迷宫问题 bfs解法

#include<stdio.h> #include<string.h> #include<algorithm> #include<stack> using namespace std; int a[5][5],b[5][5]; int di[4][2]={0,1,0,-1,1,0,-1,0}; void bfs(int x,int y) { int tx=x,ty=y,i; if(a[x][y]==0) { a[x][y]=1; for(i=0;i<