返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Matlab利用prim算法实现迷宫的生成
  • 192
分享到

Matlab利用prim算法实现迷宫的生成

Matlab prim算法生成迷宫Matlab prim算法Matlab 迷宫 2022-11-13 18:11:11 192人浏览 泡泡鱼
摘要

目录代码使用迷宫生成映射图多起点完整代码最近比较忙更新频率也慢了下来,今天带来一个比较有趣的可视化,基于prim算法的迷宫生成并用距离生成图片: 我通过各种向量化编程编写了一个

最近比较忙更新频率也慢了下来,今天带来一个比较有趣的可视化,基于prim算法的迷宫生成并用距离生成图片:

我通过各种向量化编程编写了一个迷宫生成函数,由于代码不是很短因此放在最后面展示代码,以下展示如果将最前面的参数进行改变会有啥效果。

代码使用

迷宫生成

迷宫生成就是用的非常简单的prim算法,大体就是不断的在已经开过门的房间四周随机选择紧挨着的房间,直到所有房间被开过。我的代码编写是专门弄了五个矩阵,一个存已经到过的房间,另外四个分别存上下左右打开过的围墙。

如果代码最前面的基础信息设置为:

% 地图基础信息设置
mazeSize=[30,30];
SPos=[2,5];
showMap=true;
showSurf=false;

就意味着绘制30x30个房间,从第二行第五个房间开始开门,展示迷宫但是不展示距离映射。

当然设置其他大小和其他起点也可以:

映射图

将到起点的距离映射为颜色,只需要将前面的showSurf更改为true:

% 地图基础信息设置
mazeSize=[30,30];
SPos=[2,5];
showMap=true;
showSurf=true;

当然如果设置的地图较大,建议将showMap设置为false,不然绘制的太慢了:

mazeSize=[200,200];
SPos=[50,50];
showMap=false;
showSurf=true;

当然如果把74多行的colORMap改成其他颜色,比如pink、bone、turbo、colorcube:

当然colormap可以自己设置的更复杂:

% 自定义色带
if 1
Cmap=[89,214,179
140,181,195
177,156,206
241,189,239
215,193,244
178,199,253
140,189,234
145,166,229
106,85,202]./255;
Ci=1:size(Cmap,1);Cq=linspace(1,size(Cmap,1),300);
Cmap=[interp1(Ci,Cmap(:,1),Cq,'linear')',...
     interp1(Ci,Cmap(:,2),Cq,'linear')',...
     interp1(Ci,Cmap(:,3),Cq,'linear')'];
colormap(Cmap)
end

多起点

值得一提的是,多个起点也是支持的!!

% 地图基础信息设置
mazeSize=[30,30];
SPos=[2,5;20,15];
showMap=true;
showSurf=true;

依旧可以设置颜色和更大的地图:

当然不建议将大小设置为300x300以上,???什么玩意这么香????嗷原来是我的电脑!!

完整代码

function primMaze
% @author : slandarer
% 公众号  : slandarer随笔
% 知乎    : 已由hikari更名slandarer

% 地图基础信息设置
mazeSize=[50,50];
SPos=[2,5];
showMap=true;
showSurf=true;

% 初始化可达迷宫及上下左右围墙矩阵
mazeMat=ones(mazeSize);
mazeMat(sub2ind(mazeSize,SPos(:,1),SPos(:,2)))=0;
zerosMat=zeros(mazeSize);
disMat=zeros(mazeSize);
[UMat,DMat,LMat,RMat]=...
    deal(ones(mazeSize),ones(mazeSize),ones(mazeSize),ones(mazeSize));

if showMap
    wallHdl=drawMap(UMat,DMat,LMat,RMat);
end

while any(any(mazeMat))
    % 找到全部已经走到过且周围至少有一个门的房间
    UMazeMat=zerosMat;UMazeMat(2:end,:)=mazeMat(1:end-1,:);
    DMazeMat=zerosMat;DMazeMat(1:end-1,:)=mazeMat(2:end,:);
    LMazeMat=zerosMat;LMazeMat(:,2:end)=mazeMat(:,1:end-1);
    RMazeMat=zerosMat;RMazeMat(:,1:end-1)=mazeMat(:,2:end);
    maze4Mat=UMazeMat+DMazeMat+LMazeMat+RMazeMat;
    [acRow,acCol]=find(mazeMat==0&maze4Mat>0);
    % 随机选择一个当前已经走到过的房间
    tempInd=randi(size(acRow,1),[1,1]);
    tempRow=acRow(tempInd);
    tempCol=acCol(tempInd);
    % 删掉地图外房间位置和不可达房间位置
    nextPos=[tempRow,tempCol]+[-1,0;1,0;0,-1;0,1];
    nextPos(nextPos(:,1)<1,:)=[];
    nextPos(nextPos(:,2)<1,:)=[];
    nextPos(nextPos(:,1)>mazeSize(1),:)=[];
    nextPos(nextPos(:,2)>mazeSize(2),:)=[];
    nextBool=mazeMat(sub2ind(mazeSize,nextPos(:,1),nextPos(:,2)))>0;
    nextPos=nextPos(nextBool,:);
    % 随机选择下一个房间
    nextInd=randi(size(nextPos,1),[1,1]);
    nextRow=nextPos(nextInd,1);
    nextCol=nextPos(nextInd,2);
    mazeMat(nextRow,nextCol)=0;
    disMat(nextRow,nextCol)=disMat(tempRow,tempCol)+1;
    % 打破墙壁
    switch true
        case isequal([nextRow,nextCol]-[tempRow,tempCol],[-1,0])
            UMat(tempRow,tempCol)=0;DMat(nextRow,nextCol)=0;
        case isequal([nextRow,nextCol]-[tempRow,tempCol],[1,0])
            DMat(tempRow,tempCol)=0;UMat(nextRow,nextCol)=0;
        case isequal([nextRow,nextCol]-[tempRow,tempCol],[0,-1])
            LMat(tempRow,tempCol)=0;RMat(nextRow,nextCol)=0;
        case isequal([nextRow,nextCol]-[tempRow,tempCol],[0,1])
            RMat(tempRow,tempCol)=0;LMat(nextRow,nextCol)=0;
    end
    % 用来显示地迷宫的代码
    if showMap
    refreshMap(wallHdl,UMat,DMat,LMat,RMat)
    drawnow
    end
end
% =========================================================================
% 绘制颜色映射图
if showSurf
sax=GCa;hold on
[sM,sN]=size(UMat);
sax.XLim=[0,sN]+.5;
sax.YLim=[0,sM]+.5;
sax.DataAspectRatio=[1,1,1];
surf(flipud(disMat),'EdgeColor','none')
colormap(pink)

% 自定义色带
if 0
Cmap=[89,214,179
140,181,195
177,156,206
241,189,239
215,193,244
178,199,253
140,189,234
145,166,229
106,85,202]./255;
Ci=1:size(Cmap,1);Cq=linspace(1,size(Cmap,1),300);
Cmap=[interp1(Ci,Cmap(:,1),Cq,'linear')',...
     interp1(Ci,Cmap(:,2),Cq,'linear')',...
     interp1(Ci,Cmap(:,3),Cq,'linear')'];
colormap(Cmap)
end
end
% =========================================================================
% CODE: test drawMap
% UMat(2,3)=0;
% DMat(1,3)=0;
% drawMap(UMat,DMat,LMat,RMat)
    function wallHdl=drawMap(UMat,DMat,LMat,RMat)
        ax=gca;hold on
        [M,N]=size(UMat);
        ax.XLim=[0,N]+.5;
        ax.YLim=[0,M]+.5;
        ax.DataAspectRatio=[1,1,1];
        % 绘制上方围墙
        [Y,X]=find(UMat);Y=M+1-Y;
        X=[X.'+[.5;-.5];nan.*(ones(1,length(X)))];
        Y=[Y.'+[.5;.5];nan.*(ones(1,length(Y)))];
        wallHdl{1}=plot(X(:),Y(:),'LineWidth',1,'Color','k');
        % 绘制下方围墙
        [Y,X]=find(DMat);Y=M+1-Y;
        X=[X.'+[.5;-.5];nan.*(ones(1,length(X)))];
        Y=[Y.'+[-.5;-.5];nan.*(ones(1,length(Y)))];
        wallHdl{2}=plot(X(:),Y(:),'LineWidth',1,'Color','k');
        % 绘制左侧围墙
        [Y,X]=find(LMat);Y=M+1-Y;
        X=[X.'+[-.5;-.5];nan.*(ones(1,length(X)))];
        Y=[Y.'+[.5;-.5];nan.*(ones(1,length(Y)))];
        wallHdl{3}=plot(X(:),Y(:),'LineWidth',1,'Color','k');
        % 绘制右侧围墙
        [Y,X]=find(RMat);Y=M+1-Y;
        X=[X.'+[.5;.5];nan.*(ones(1,length(X)))];
        Y=[Y.'+[.5;-.5];nan.*(ones(1,length(Y)))];
        wallHdl{4}=plot(X(:),Y(:),'LineWidth',1,'Color','k');
    end
% -------------------------------------------------------------------------
    function refreshMap(wallHdl,UMat,DMat,LMat,RMat)
        [M,~]=size(UMat);
        % 绘制上方围墙
        [Y,X]=find(UMat);Y=M+1-Y;
        X=[X.'+[.5;-.5];nan.*(ones(1,length(X)))];
        Y=[Y.'+[.5;.5];nan.*(ones(1,length(Y)))];
        wallHdl{1}.XData=X(:);
        wallHdl{1}.YData=Y(:);
        % 绘制下方围墙
        [Y,X]=find(DMat);Y=M+1-Y;
        X=[X.'+[.5;-.5];nan.*(ones(1,length(X)))];
        Y=[Y.'+[-.5;-.5];nan.*(ones(1,length(Y)))];
        wallHdl{2}.XData=X(:);
        wallHdl{2}.YData=Y(:);
        % 绘制左侧围墙
        [Y,X]=find(LMat);Y=M+1-Y;
        X=[X.'+[-.5;-.5];nan.*(ones(1,length(X)))];
        Y=[Y.'+[.5;-.5];nan.*(ones(1,length(Y)))];
        wallHdl{3}.XData=X(:);
        wallHdl{3}.YData=Y(:);
        % 绘制右侧围墙
        [Y,X]=find(RMat);Y=M+1-Y;
        X=[X.'+[.5;.5];nan.*(ones(1,length(X)))];
        Y=[Y.'+[.5;-.5];nan.*(ones(1,length(Y)))];
        wallHdl{4}.XData=X(:);
        wallHdl{4}.YData=Y(:);
    end
end

以上就是Matlab利用prim算法实现迷宫的生成的详细内容,更多关于Matlab prim算法生成迷宫的资料请关注编程网其它相关文章!

--结束END--

本文标题: Matlab利用prim算法实现迷宫的生成

本文链接: https://lsjlt.com/news/169336.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Matlab利用prim算法实现迷宫的生成
    目录代码使用迷宫生成映射图多起点完整代码最近比较忙更新频率也慢了下来,今天带来一个比较有趣的可视化,基于prim算法的迷宫生成并用距离生成图片: 我通过各种向量化编程编写了一个...
    99+
    2022-11-13
    Matlab prim算法生成迷宫 Matlab prim算法 Matlab 迷宫
  • Python利用Prim算法生成迷宫
    Prim算法随机生成后的迷宫数列矩阵如下图: 15x15: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s 0 1 0 1 0 1 1 1 1 1 0 ...
    99+
    2023-01-06
    Python Prim生成迷宫 Python生成迷宫 Python Prim算法
  • Python Prim算法通过遍历墙实现迷宫的生成
    之前,我们在另外一篇文章中使用Prim算法生成了一个完美迷宫,利用的是遍历网格的方法,这一次,我们要教教大家用遍历墙的方法生成,上一篇文章链接:Python利用Prim算法生成迷宫 ...
    99+
    2023-01-06
    Python Prim生成迷宫 Python生成迷宫 Python Prim算法
  • Python如何实现迷宫生成器
    这篇文章主要介绍了Python如何实现迷宫生成器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python如何实现迷宫生成器文章都会有所收获,下面我们一起来看看吧。首先展示一下效果图:我们先分析一下所需的库:既...
    99+
    2023-07-02
  • Python实现迷宫生成器的详细代码
    作为一项古老的智力游戏,千百年来迷宫都散发着迷人的魅力。但是,手工设计迷宫费时又耗(脑)力,于是,我们有必要制作一个程序:迷宫生成器…… 好吧,我编不下去...
    99+
    2024-04-02
  • python实现地牢迷宫生成的完整步骤
    目录基本属性生成房间生成墙壁生成门口生成通道总结 基本属性 定义当前地牢的等级,地图长宽,房间数量,房间的最小最大长度,如下 class Map: def __...
    99+
    2024-04-02
  • Python实现随机生成迷宫并自动寻路
    目录Python深搜版:Python 广搜版lua版:Python深搜版: 核心在于带随机的深搜(见代码第23到27行,其实也可以用22行代替这几行代码,你可以试着把第24行的数字4改大或者改小,即调整随机程度) ...
    99+
    2022-06-02
    Python随机生成迷宫 Python 迷宫自动寻路
  • 如何利用JAVA实现走迷宫程序
    本Demo使用三个类 一个Test类 一个自定义的Stack类 一个自定义的Queue类 可以实现的功能: 1.对于一个写在文本文件中的迷宫,能够将其转换为二维数组用广度优先搜索实现...
    99+
    2024-04-02
  • C++ DFS算法实现走迷宫自动寻路
    C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容如下 深度优先搜索百度百科解释: 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Searc...
    99+
    2024-04-02
  • C++ DFS算法如何实现走迷宫自动寻路
    小编给大家分享一下C++ DFS算法如何实现走迷宫自动寻路,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容...
    99+
    2023-06-15
  • C++ 基于BFS算法的走迷宫自动寻路的实现
    目录1.效果图2.实现代码1.队列方法类2.地图方法类3.main函数3.思路1.效果图 其中正方形代表障碍物,实心菱形代表移动者(人),空心菱形代表目标位置(都是可以在代码中修改...
    99+
    2024-04-02
  • 利用Matlab实现迭代适应点算法
    目录1.算法描述2.工具函数3.函数调用4.优势与不足道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法、迭代适应点算...
    99+
    2024-04-02
  • 利用Python实现自动生成小学生计算题
    目录生成计算题写入Word中过年期间发现小外甥已经上小学了,我姐说老师今天给他们布置了寒假作业:每天坚持做乘法和加减法混合运算。 这我必须帮帮忙,用Python写了一段自动生成小学生...
    99+
    2023-02-07
    Python生成计算题 Python计算题
  • 使用python求解迷宫问题的三种实现方法
    目录前言递归求解回溯求解队列求解总结前言 在迷宫问题中,给定入口和出口,要求找到路径。本文将讨论三种求解方法,递归求解、回溯求解和队列求解。 在介绍具体算法之前,先考虑将迷宫数字化。...
    99+
    2024-04-02
  • LeetCode 算法练习:利用 Python 实现二维码生成器
    二维码(QR Code)是一种可以被扫描并读取信息的图像码,它已经广泛应用于电子支付、电子票务、广告传播等领域。本篇文章将介绍如何使用 Python 实现一个简单的二维码生成器,帮助初学者更好地理解二维码的生成原理和相关算法。 一、二维码...
    99+
    2023-08-20
    二维码 leetcode 编程算法
  • 使用OpenCV实现迷宫解密的全过程
    目录一、你能自己走出迷宫吗?二、使用OpenCV找出出口。1、对图像进行二值化处理。2、 对二值化后的图像进行轮廓检测并标注3、对图像阈值进行处理。4、对图像进行扩展操作。...
    99+
    2024-04-02
  • 怎么利用Matlab实现迭代适应点算法
    本篇内容主要讲解“怎么利用Matlab实现迭代适应点算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么利用Matlab实现迭代适应点算法”吧!道格拉斯-普克算法(Douglas&nd...
    99+
    2023-06-29
  • 利用Python脚本生成sitemap.xml的实现方法
    安装lxml 首先需要pip install lxml安装lxml库。 如果你在ubuntu上遇到了以下错误: #include "libxml/xmlversion.h" compilation ...
    99+
    2022-06-04
    脚本 方法 Python
  • PHP利用雪花(SnowFlake)算法生成唯一ID
    目录一、雪花算法原理解析1. 分布式ID常见生成策略2. 雪花算法的结构二、PHP源码实现案例1.demo12.demo2这个算法的好处很简单可以在每秒产生约400W个不同的16位数...
    99+
    2024-04-02
  • Matlab利用随机森林(RF)算法实现回归预测详解
    目录1 分解代码1.1 最优叶子节点数与树数确定1.2 循环准备1.3 数据划分1.4 随机森林实现1.5 精度衡量1.6 变量重要程度排序1.7 保存模型2 完整代码本文分为两部分...
    99+
    2023-02-17
    Matlab随机森林 回归预测 Matlab 回归预测 Matlab随机森林
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作