迷宫寻路

题目描述

定义一个二维数组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)

算法:宽度优先搜索(bfs)

为了方便输出路径,我们从终点开始搜索,用一个队列维护过程中走的坐标即可

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int N=11;
int n,m;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
vector<vector<int>>dis(N,vector<int>(N,-1));
vector<vector<int>>matrix(N,vector<int>(N));
queue<pair<int,int>>q;
int bfs(){
    dis[n-1][m-1]=0;
    q.push({n-1,m-1});
    while(q.size()){
        auto t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int a=t.first+dx[i],b=t.second+dy[i];
            if(a>=0&&a<n&&b>=0&&b<m&&matrix[a][b]==0&&dis[a][b]==-1){
                dis[a][b]=dis[t.first][t.second]+1;
                q.push({a,b});
            }
        }
    }
    return dis[0][0];
}
int main(void){
    cin>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cin>>matrix[i][j];
    bfs();
    int x=0,y=0;
    cout<<"("<<x<<","<<y<<")"<<endl;
    while(x!=n-1||y!=m-1){
        for(int i=0;i<4;i++){
            int nx=x+dx[i],ny=y+dy[i];
            if(nx>=0&&nx<n&&ny>=0&&ny<m&&dis[nx][ny]!=-1){
                if(dis[x][y]==dis[nx][ny]+1){
                    x=nx,y=ny;
                    cout<<"("<<x<<","<<y<<")"<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/programyang/p/11153084.html

时间: 2024-11-13 09:52:34

迷宫寻路的相关文章

数据结构应用实例#栈#迷宫寻路

使用数据结构 栈(Stack)来实现一种低级的迷宫寻路的功能.低级是因为无法判断路径是不是最短的. 这里使用的栈结构如图 (这图我选择死亡...) 注意结构体里DataType的实际含义,是另外一个结构体,用于储存二维位置x,y 地图使用一个10x10的二维数组来表示,数字1表示该点是墙壁,0表示可以行走,2表示已经走过的地方. 我们用栈来储存走过的位置,比如我们从起点(4,0)出发,就把(4,0)压入栈,并把该点数值改为2,意为已经来过了.如果遇到死路,那就不停地出栈,直到栈顶的这个点周围有路

Unity3D之迷宫寻路使用_直接寻路

学了一段时间的寻路,在网上也学了挺多算法,今天整理了一下,使用到Unity的3D界面中用于寻路,首先是简单的寻路算法,以下是地图: 地图数组: using UnityEngine; using System.Collections; public static class MapsArray { public static int[,] MazeItem = new int[15, 10] //初始化迷宫 { {1,1,1,1,1,1,1,1,1,1}, {1,0,1,1,1,0,0,0,1,1

Unity3D之迷宫寻路_A*最短路径寻路

A*寻路相信很多人都听说过,也是比较基本的一种算法,具体概念我就不多说了,网上查找一下一大堆,我直接贴上我的A*应用方法,以下是地图: 接下来是地图数组: using UnityEngine; using System.Collections; public static class MapsArray { public static int[,] MazeItem = new int[15, 10] //初始化迷宫 { {1,1,1,1,1,1,1,1,1,1}, {1,0,1,1,1,0,0

迷宫寻路问题全解

1.深度优先搜索(DFS)+回溯 最基本的板子: void DFS(int x,int y) { if (x,y都与目标点相同) { 得到一个解; } else { for (int i = 1; i <= 四个方向; i++) if (满足进一步搜索条件) { 为进一步搜索所需要的状态打上标记; DFS(to_x, to_y); 恢复到打标记前的状态;//也就是回溯一步 } } } 适用类型①:求可行解数量 https://www.luogu.org/problemnew/show/P1605

NEFU 558 迷宫寻路

题目链接 简单搜索题 #include <cstdio> #include <iostream> #include <cstring> using namespace std; char c[1005][1005]; int n,m; bool vis[1005][1005]; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; void dfs(int i,int j) { if(i<0||j<0||i==n||j==m

用栈实现迷宫游戏寻路

在我们学习数据结构的时候都曾经见过迷宫游戏,迷宫游戏的实现其实并不难,但是,我们在实现每一个算法的时候都应该想一想这个问题的每一个解.最近,博主已经开始重温数据结构啦,记得我们以前学习这里的时候,老师会用队列来实现迷宫最优解的寻找,氮素呢,博主就是这么可爱,博主就是想试试用栈来找一下. 在实现之前让我们先来复习一下栈的特点:first in last out 对于栈这种数据结构我们只能在栈顶对其操作,根据实际情况可将其实现成链式或者顺序结构.但是一般情况下我们都会实现成顺序结构,因为栈的特点导致

3-4-迷宫寻路-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 迷宫寻路 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c        相关测试数据下载

AI-随机迷宫&amp;迷宫求解

本文记录了,人工智能中简单的搜索策略中的路径搜索策略中的A*算法,来实现迷宫寻路的问题.(这只是一次本人的课外作业) 完整的程序源码已经发送到我的Git.这里只记录了我的思路和感想以及收获. 产生随机迷宫 迷宫求解没有迷宫怎么可以呢.而本人是个懒人,每次都要手动输入迷宫,重复性的工作让我很不爽.你可以在程序中用数组定义一个迷宫啊,有强迫症的我,怎么可以这样随便的要求自己的程序呢.及时求解算法的出来了,但是测试数据有限,还是让我很不爽的,所以,干脆先花一些时间,写个随机迷宫的产生吧. 遇事先搜索,

一道广搜寻路题

同样是在qq群里看到的题目,想了好久算法,实现也用了很久. 关于题目首先看图: 总的来说,就是一个二维迷宫的寻路,迷宫中有对应的钥匙和刺,每走一步会消耗1点Hp,当走到刺上时会额外消耗100点hp,持有对应颜色的钥匙通过刺时不用额外消耗Hp. 给予起点和终点的坐标,,输出移动方式,让人物抵达终点所消耗的Hp尽可能的小. 例子: 3 3 1..a##A...1 13 3这个是输入数据 第一个代表高 第二个宽 第三个是钥匙和陷阱的对数 .代表平地 #代表墙 小写字母是钥匙 大写字母是对应的陷阱输出为