matlab迷宫做短路径,迷宫最短路径问题解析

有一个二维数组,0表示路,-1表示墙,求其中任意两点的最短路径。

我们先看,怎么求一条路径:求两点路径是一个数据结构上的典型的迷宫问题,很多数据结构的书上都有介绍,解决办法如下:

从一点开始出发,向四个方向查找,每走一步,把走过的点的值+1(即本节点值+1),防止重复行走,并把走过的点压入堆栈(表示路径),如果遇到墙、或者已走过的点则不能前进,如果前方已经无路可走,则返回,路径退栈,这样递归调用,直到找到终点为止。

迷宫如下图所示:

c7c60386d663df6cc027639f2c9b5d09.png

从(2, 1)到(6, 8),程序如下所示:

cbef093dcc044b2793832001e2365e43.pngstruct Postion

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngint_X, _Y;

df37983f39daa189b8c814e01a6a9011.png

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png    Postion()918e8df969f9f8c8d002f25cda86cade.png{}df37983f39daa189b8c814e01a6a9011.png    Postion(intX,intY)

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png        : _X(X), _Y(Y)918e8df969f9f8c8d002f25cda86cade.png{}0ac3a2d53663ec01c7f7225264eeefae.png};

cbef093dcc044b2793832001e2365e43.png

cbef093dcc044b2793832001e2365e43.pngbool isCanGo(constintprePosValue,

cbef093dcc044b2793832001e2365e43.png             constintposX,

cbef093dcc044b2793832001e2365e43.png             constintposY)

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngif(   posX<0||posX>9//越界df37983f39daa189b8c814e01a6a9011.png||posY<0||posY>9df37983f39daa189b8c814e01a6a9011.png||maze[posX][posY]==-1//墙df37983f39daa189b8c814e01a6a9011.png||maze[posX][posY]>=1)//走过f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngreturnfalse;

4a5daaec04350a363f186a4d2c5ed6ce.png    }df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.pngreturntrue;

0ac3a2d53663ec01c7f7225264eeefae.png}cbef093dcc044b2793832001e2365e43.png

cbef093dcc044b2793832001e2365e43.png

cbef093dcc044b2793832001e2365e43.pngstackpath__;//路径cbef093dcc044b2793832001e2365e43.pngcbef093dcc044b2793832001e2365e43.pngPostion offset[4];//路径cbef093dcc044b2793832001e2365e43.pngcbef093dcc044b2793832001e2365e43.pngbool shortestPath(stack&path,

cbef093dcc044b2793832001e2365e43.png                  const Postion&start,

cbef093dcc044b2793832001e2365e43.png                  const Postion&end)

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngif(   start._X==end._X 

df37983f39daa189b8c814e01a6a9011.png&&start._Y==end._Y)

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.png        path__=path;

df37983f39daa189b8c814e01a6a9011.pngreturntrue;

4a5daaec04350a363f186a4d2c5ed6ce.png    }df37983f39daa189b8c814e01a6a9011.png    

df37983f39daa189b8c814e01a6a9011.pngfor(inti=0; i<4; i++)

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngintnNextPos_X=start._X+offset[i]._X;

df37983f39daa189b8c814e01a6a9011.pngintnNextPos_Y=start._Y+offset[i]._Y;

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.pngif(isCanGo(maze[start._X][start._Y], nNextPos_X, nNextPos_Y))

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.png            maze[nNextPos_X][nNextPos_Y]=maze[start._X][start._Y]+1;

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.png            path.push(Postion(nNextPos_X, nNextPos_Y));

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.pngif(shortestPath(path, Postion(nNextPos_X, nNextPos_Y), end))

df37983f39daa189b8c814e01a6a9011.pngreturntrue;

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.png            path.pop();

4a5daaec04350a363f186a4d2c5ed6ce.png        }4a5daaec04350a363f186a4d2c5ed6ce.png    }df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.pngreturnfalse;

0ac3a2d53663ec01c7f7225264eeefae.png}cbef093dcc044b2793832001e2365e43.png

cbef093dcc044b2793832001e2365e43.pngintmain(intargc,char*argv[])

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.png    offset[0]._X=-1;    offset[0]._Y=0;//上df37983f39daa189b8c814e01a6a9011.pngoffset[1]._X=1;    offset[1]._Y=0;//下df37983f39daa189b8c814e01a6a9011.pngoffset[2]._X=0;    offset[2]._Y=-1;//左df37983f39daa189b8c814e01a6a9011.pngoffset[3]._X=0;    offset[3]._Y=1;//右df37983f39daa189b8c814e01a6a9011.pngdf37983f39daa189b8c814e01a6a9011.png    printMat(maze);

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.png    Postion start(2,1), end(6,8);

df37983f39daa189b8c814e01a6a9011.png    maze[start._X][start._Y]=1;//置起点值1, 防止走回起点df37983f39daa189b8c814e01a6a9011.pngshortestPath(stack(), start, end);

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.png    printPath(path__);

df37983f39daa189b8c814e01a6a9011.png    printMat(maze);

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.pngreturn0;

0ac3a2d53663ec01c7f7225264eeefae.png}cbef093dcc044b2793832001e2365e43.png

这时,我们经过运算,到达终点,有44步之多。如果我们调整调用offset的顺序,即先左右,后上下,可能会得到更短的路径,但无法确保在任何情况下都能得到最短路径。

得到最短路径的方法,解决方法如下:

每走一步,就对前方的节点赋值为此节点+1,走过的路径也可以重复行走。但有一个条件,就是本节点+1必须小于已走过的节点的权值(墙不能走),这样走遍所有的节点,记录最短的路径。

主要修改了以下两个函数:

cbef093dcc044b2793832001e2365e43.pngbool isCanGo(constintprePosValue,

cbef093dcc044b2793832001e2365e43.png             constintposX,

cbef093dcc044b2793832001e2365e43.png             constintposY)

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngif(   posX<0||posX>9//越界df37983f39daa189b8c814e01a6a9011.png||posY<0||posY>9df37983f39daa189b8c814e01a6a9011.png||maze[posX][posY]==-1)//墙f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngreturnfalse;

4a5daaec04350a363f186a4d2c5ed6ce.png    }df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.pngif(maze[posX][posY]==0)//未走过df37983f39daa189b8c814e01a6a9011.pngreturntrue;

df37983f39daa189b8c814e01a6a9011.pngelse//更近的路径df37983f39daa189b8c814e01a6a9011.pngreturn(prePosValue+1)

0ac3a2d53663ec01c7f7225264eeefae.png}cbef093dcc044b2793832001e2365e43.png

cbef093dcc044b2793832001e2365e43.pngvoidshortestPath(stack&path,

cbef093dcc044b2793832001e2365e43.png                  const Postion&start,

cbef093dcc044b2793832001e2365e43.png                  const Postion&end)

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngif(   start._X==end._X 

df37983f39daa189b8c814e01a6a9011.png&&start._Y==end._Y)

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngif(path.size()path__=path;

df37983f39daa189b8c814e01a6a9011.pngreturn;

4a5daaec04350a363f186a4d2c5ed6ce.png    }df37983f39daa189b8c814e01a6a9011.png    

df37983f39daa189b8c814e01a6a9011.pngfor(inti=0; i<4; i++)

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.pngintnNextPos_X=start._X+offset[i]._X;

df37983f39daa189b8c814e01a6a9011.pngintnNextPos_Y=start._Y+offset[i]._Y;

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.pngif(isCanGo(maze[start._X][start._Y], nNextPos_X, nNextPos_Y))

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png918e8df969f9f8c8d002f25cda86cade.png{

df37983f39daa189b8c814e01a6a9011.png            maze[nNextPos_X][nNextPos_Y]=maze[start._X][start._Y]+1;

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.png            path.push(Postion(nNextPos_X, nNextPos_Y));

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.png            shortestPath(path, Postion(nNextPos_X, nNextPos_Y), end);

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.png            path.pop();

4a5daaec04350a363f186a4d2c5ed6ce.png        }4a5daaec04350a363f186a4d2c5ed6ce.png    }0ac3a2d53663ec01c7f7225264eeefae.png}cbef093dcc044b2793832001e2365e43.png 

cbef093dcc044b2793832001e2365e43.png

我上传了两个工程,求一条路径的程序点此下载,求最短路径的程序点此下载。

文章结束!愿它对您有所帮助。

posted on 2008-03-18 17:47 胡满超 阅读(8185) 评论(4)  编辑 收藏 引用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中,解决迷宫中的最短路径问题通常可以使用图论的方法,比如广度优先搜索(Breadth-First Search, BFS)或Dijkstra算法。这两个算法常用于寻找两点之间的最短路径。下面是使用BFS的一个基本示例: **使用BFS解决迷宫最短路径:** 1. **创建迷宫矩阵**:首先,你需要将迷宫表示为一个二维数组,0代表可以通行,1代表墙壁。 2. **初始化**:设置起点和终点,定义一个队列来存储节点,并标记起点为已访问。 3. **广度优先遍历**: a. 将起点加入队列。 b. 当队列不为空时,从队首取出一个节点,如果它是终点,则找到路径;如果不是,检查其邻居(上下左右)是否可通行且未访问过,可通行则标记为已访问并加入队列。 c. 重复步骤b,直到队列为空或找到终点。 4. **路径记录**:在找到路径后,可以通过回溯记录下每个节点,从而得到从起点到终点的最短路径。 **使用Dijkstra算法**: Dijkstra算法适合有权重的图,如果你的迷宫有特定的难度值(如距离或代价),你可以用它来寻找最低成本的路径。该算法从起点开始,逐步更新到每个节点的最短路径。 **相关问题--:** 1. 如何在MATLAB中表示一个二维迷宫矩阵? 2. Dijkstra算法与BFS相比,在什么情况下更适用? 3. 如果迷宫有复杂规则(如动态变化或随机生成),如何处理? 如果需要具体代码示例,请告诉我,我可以提供一个简化版的MATLAB代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值