迷宫问题(bfs的应用)

问题描述:

定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:

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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。

Input

一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

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)

使用广度搜素,第一个找到出口的路径一定是最短路径。

搜索过程中使用 point pre[][]数据记录上一坐标的位置,用来保存路径,这样就可以从pre[m][n]往回找寻路径,一直找到pre[0][0]。

搜索过程中可以需要改变迷宫数组mn为第三种状态,以防止重复搜索。相当于一般用法中自己定义visited数组了。

#include<iostream>
#include<queue>
#include<stack>
using namespace std;
//定义坐标
struct point
{
    int x;
    int y;
};

int mn[11][11];//记录迷宫状态:0可以访问,1不能访问,-1已经访问过
point pre[11][11];//记录上一个访问的坐标
point mov[4]={{-1,0},{0,-1},{0,1},{1,0}}; //表示坐标的移动方向

bool bfs(int m,int n,int x,int y)
{
    queue<point> zb;
    point temp;
    temp.x=x;
    temp.y=y;
    zb.push(temp);
    mn[x][y]=-1;
    while(!zb.empty())
    {
        point top;
        top=zb.front();
        zb.pop();
        for(int i=0;i<4;i++)
        {
            if(top.x+ mov[i].x==m-1 && top.y+mov[i].y==n-1)
            {
                mn[top.x+ mov[i].x][top.y+mov[i].y]=-1;
                pre[top.x+ mov[i].x][top.y+mov[i].y]=top;
                return true;
            }
            if(mn[top.x+ mov[i].x][top.y+mov[i].y]==0)
            {
                mn[top.x+ mov[i].x][top.y+mov[i].y]=-1;
                pre[top.x+ mov[i].x][top.y+mov[i].y]=top;
                point t;
                t.x=top.x+ mov[i].x;
                t.y=top.y+mov[i].y;
                zb.push(t);
            }
        }
    }
    return false;
}

int main()
{
    int m,n;
    cin>>m>>n;
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>mn[i][j];
        }
    }
    stack<point>st;
    if(bfs(m,n,0,0))
    {
        point temp;
        temp.x=m-1;
        temp.y=n-1;
        while(!(temp.x==0 && temp.y==0) )
        {
            st.push(temp);
            temp=pre[temp.x][temp.y];
        }
        temp.x=0;
        temp.y=0;
        st.push(temp);
        while(!st.empty())
        {
            cout<<‘(‘<<st.top().x<<‘,‘<<st.top().y<<‘)‘<<endl;
            st.pop();
        }
    }
    return 0;
}
时间: 2024-08-03 23:31:41

迷宫问题(bfs的应用)的相关文章

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所面向的方向未定,她可

迷宫问题 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可以穿越,有些地

noip 01迷宫(BFS+记忆化)

题目链接:https://www.luogu.org/problem/show?pid=1141 题意:给出一个仅由数字0与1组成的n×n格迷宫.放0的那一格可以4个方向走到放1那一格,1也是四个方向走到放0的那一格.算上本身的那格.求最多能移动多少格子. 数据比较大,如果直接用bfs搜的话会暴时.所以需要每次搜索完都记录一下. 1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 using

学霸的迷宫(BFS+记录路径)

1 //求从(sx.sy)到(gx.gy)的最短距离; 2 3 #include<iostream> 4 #include<cstdio> 5 #include<cstdio> 6 #include<queue> 7 #include<cstring> 8 #define INF 99999999 9 10 using namespace std; 11 12 typedef pair<int, int > P; //数对,记录位置

HDU1728 逃离迷宫【BFS】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目大意: 有一个M*N的矩阵迷宫.其中,字符'.'表示此处为空地,字符'*'表示此处为障碍.在迷宫中,只能向 相邻的上.下.左.右方向走.而且在走的时候,转弯最多不能超过k次.给你初始位置(x1,y1),终 止位置(x2,y2),问:是否能从初始位置走到终止位置. 思路: 建立一个结构体,结构体中(x,y)表示当前位置,t表示目前的转弯次数.搜索四个方向,并记录下转弯 数,如果转弯数大于或

POJ 3984 迷宫问题 bfs

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

简单的迷宫(bfs)noj1793

题目描述 睁开眼睛,Bob发现自己被困在一个迷宫里了,是做梦么… 不管那么多了,还是先离开为妙.不过由于恐惧,Bob希望找到一条从入口到出口的最短路径,你能帮帮他么? 这个迷宫相当简单,它是一个N*M的矩形区域,每个格点可以通向相邻上下左右四个格点,起点为(1,1),终点为(N,M).除此之外,迷宫内还有K个点为障碍点,表示他们不可到达,但障碍点不会出现在起点和终点. 输入 组数据输入. 每组数据,第一行N,M,K, 2<=N,M<=50,0<=k<=N*M-2, 接下来k行,每行