MATLAB迷宫算法 自动生成迷宫并可视化寻找出路
迷宫程序是新手常用的练习算法之一,迷宫生成与循迹的快慢取决于所建立的模型的好坏。本文介绍一种数学模型,用以自动生成(任意规模)的迷宫并可视化寻找最优出路。
废话不多说,都在代码里,原理很简单,可以仔细阅读代码
效果图如下:(迷宫大小可自行设置)
本文代码在MATLAB2016码出来的,若有问题请检查函数的使用
%%%%%***************迷宫程序*************************
%%%****(包括自动生成迷宫以及可视化寻找出路)************
clc
close all
clear all
%%%迷宫规模ak X ak,并规定寻迹时行走速度
ssss=0.02;%%速度
ak=60;%%迷宫规模(ak*ak)
CS12=1;%%是否展示循迹过程(1:是,其他:否)
%%%*****************主程序***************************
C=[1,ak];%%出口
R=[ak,1];%%入口
x0=[0 ak ak 0 0];
y0=[0 0 ak ak 0];
plot(x0,y0)%%画出基本画框
hold on
C1=[C(1)-1,C(1),C(1),C(1)-1,C(1)-1C(2)-1,C(2)-1,C(2),C(2),C(2)-1];
fill(C1(1,:),C1(2,:),'g')
hold on
R1=[R(1)-1,R(1),R(1),R(1)-1,R(1)-1R(2)-1,R(2)-1,R(2),R(2),R(2)-1];
fill(R1(1,:),R1(2,:),'R')%%填充出入口
set(gcf,'Unit','normalized','Position',[0,0,0.6,1])
hold on
axis([0,ak,0,ak]);%%发图大小
ok=1;
% for mmm=1:1
% % while ok~=0
aaaa=fix(rand(ak,ak)*4);%%随机生成墙体矩阵
bbbb=tril(aaaa,-1)+triu(aaaa',0);
x1=bbbb;
%%%强行约束出入口,主要是保证能够进出 出入口
x1(R(1),R(2))=3;
x1(R(1),R(2)+1)=3;
x1(R(1)-1,R(2))=2;
x1(R(1)-1,R(2)+1)=x1(R(1)-1,R(2)+2);x1(C(1),C(2))=0;
x1(C(1),C(2)-1)=1;
x1(C(1)+1,C(2))=0;
x1(C(1)+1,C(2)-1)=x1(C(1)+2,C(2)-1);
%%%for循环内部的作用为:提高迷宫的可解性,但是会缺少灵魂
% for i=3:length(x1)-2
% % x1(i,length(x1)-i+1)=2;
% % x1(i-1,length(x1)-i)=1;
% % x1(i-1,length(x1)-i+2)=0;
% x1(i,length(x1)-i+2)=x1(i-1,length(x1)-i+1)+2;
% % x1(i,length(x1)-i)=x1(i+1,length(x1)-i+1)+1;
% x1(i+1,length(x1)-i+1)=x1(i-2,length(x1)-i+1)+0;
% % x1(i-1,length(x1)-i+1)=x1(i+2,length(x1)-i+1)+1;
% endk=length(x1(1,:));
%%%画隔板******并记录每面墙的数据LJ ****最终将墙体的全局信息存入矩阵SD****
for i=1:kfor j=1:kswitch x1(i,j)+1case 1plot([i,i-1],[j,j],'color','b','linewidth',1)LJ(2*i,2*j+1)=1;case 2plot([i-1,i-1],[j,j-1],'color','b','linewidth',1)LJ(2*i-1,2*j)=1;case 3plot([i,i-1],[j-1,j-1],'color','b','linewidth',1) LJ(2*i,2*j-1)=1;case 4plot([i,i],[j,j-1],'color','b','linewidth',1)LJ(2*i+1,2*j)=1;endend
end
LJ(1,:)=ones;
LJ(:,1)=ones;
LJ(2*k+1,:)=ones;
LJ(:,2*k+1)=ones;
SD=LJ;
SD(R)=SD(R)+1;
SD(C)=SD(C)+1;
xx=R(1);
yy=R(2);
h1=plot(xx,yy,'color','g','linewidth',3);
hold on
%%寻找出路部分*********上下左右的循迹方向具有不同优先级
aac=0;
GJ=zeros(2,1e3);
while xx~=C(1)||yy~=C(2)az=[SD(2*xx,2*yy+1),SD(2*xx-1,2*yy),SD(2*xx,2*yy-1),SD(2*xx+1,2*yy)];if min(az)<1wz=min(find(az==min(az)));elsewz=[];endif isempty(wz)==1error('抱歉,已无路可走') close allclearelse
%%%选择移动方向(优先级依次为上,左,下,右)**switch wzcase 1xx1=xx;yy1=yy+1;case 2xx1=xx-1;yy1=yy;case 3xx1=xx;yy1=yy-1;case 4xx1=xx+1;yy1=yy;endaac=aac+1;GJ(:,aac)=[xx1yy1];%%%记录轨迹
%%%方向已选定为xx1,yy1*************end%以下的一个set和四个plot以及pause作用均是体现内部循迹原理的作用if CS12==1set(h1,'Xdata',[xx-0.5,xx1-0.5],'Ydata',[yy-0.5,yy1-0.5])hold onkm=1/3;switch wzcase 1plot([xx,xx-1],[yy,yy],'-.','color','r','linewidth',1)SD(2*xx,2*yy+1)=SD(2*xx,2*yy+1)+km;case 2plot([xx-1,xx-1],[yy,yy-1],'-.','color','r','linewidth',1)SD(2*xx-1,2*yy)=SD(2*xx-1,2*yy)+km;case 3plot([xx,xx-1],[yy-1,yy-1],'-.','color','r','linewidth',1) SD(2*xx,2*yy-1)=SD(2*xx,2*yy-1)+km;case 4plot([xx,xx],[yy,yy-1],'-.','color','r','linewidth',1)SD(2*xx+1,2*yy)=SD(2*xx+1,2*yy)+km;endxx=xx1;yy=yy1;pause(0.01)elsekm=1/3;switch wzcase 1SD(2*xx,2*yy+1)=SD(2*xx,2*yy+1)+km;case 2SD(2*xx-1,2*yy)=SD(2*xx-1,2*yy)+km;case 3SD(2*xx,2*yy-1)=SD(2*xx,2*yy-1)+km;case 4SD(2*xx+1,2*yy)=SD(2*xx+1,2*yy)+km;endxx=xx1;yy=yy1;end
% pause(ssss/100)
end
%%**************寻迹之后规划最优路径***********
sl=min(find(GJ(1,:)==0))-1;
GJ(:,sl+1:end)=[];
% GG=GJ;
% [b,location] = unique(GG.','rows','first');
% res = sortrows([location,b]);
% GJ=res(:,2:size(res,2)).'%%%此上三句是消除重复行走的位置
% hold off
for mmk=1:length(GJ(1,:))-1for mk1=mmk+1:length(GJ(1,:))if GJ(:,mmk)==GJ(:,mk1)GJ(:,mmk:mk1-1)=zeros(2,mk1-mmk);endend
end
GJ(:,find(GJ(1,:)==0))=[];
GJ=[R.',GJ];
for mk=1:length(GJ(1,:))-1plot([GJ(1,mk)-0.5,GJ(1,mk+1)-0.5],[GJ(2,mk)-0.5,GJ(2,mk+1)-0.5],'color','g')hold onif CS12==1pause(ssss)elsepause(ssss/2)end
end
MATLAB迷宫算法 自动生成迷宫并可视化寻找出路相关推荐
- Matlab/Simulink自动生成STM32代码_基于模型的开发_环境搭建
目录 前言 官方简介 Matlab R2018b安装 STM32-MAT/TARGET 安装 STM32CubeMX 安装 STM32CubeIDE, Keil安装 ST-Link驱动安装 微信公众号 ...
- Matlab/Simulink自动生成C代码实验
目录 0. 概要 1. Matlab /Simulink/Embedded Coder关系与区别 2. 搭建Simulink模型及仿真 2.1 搭建模型 2.2 仿真 3. 生成代码 3.1 求解器设 ...
- 利用matlab程序自动生成feko近场云图及matlab程序实现自动化feko运行
Feko是一款非常实用的电磁仿真软件,目前许多研究的验证及数据的制作都需要借助Feko来实现.但是对于刚入门的同学来说,feko的数据获取比较麻烦,需要在每一次运行结束后手动调节参数再执行下一个运行程 ...
- html5 自动生成迷宫,HTML5 Canvas随机迷宫生成动画
JavaScript 语言: JaveScriptBabelCoffeeScript 确定 class Line { constructor(x, y, a, c) { this.x1 = x; th ...
- java迷宫生成代码_maxe.java 源代码在线查看 - Java Maze 计算机自动生成迷宫 资源下载 虫虫电子下载站...
public class Maxe{ private int startI, startJ; // 入口 private int endI, endJ; // 出口public void setSta ...
- Android自动生成Shape资源文件,迈出可视化脚手架第一步(上)
系列文章目录 第一章:Android自动生成代码,可视化脚手架,将大大提高开发效率 第二章:Android自动生成代码,可视化脚手架之环境搭建 第三章:Android自动生成代码,可视化脚手架之基础信 ...
- c语言随机prim算法的迷宫生成,Prim算法生成迷宫
初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...
- 我的世界服务器物品箱子,我的世界怎么拿完箱子里的东西让他自动生成 | 手游网游页游攻略大全...
发布时间:2015-11-29 我的世界死亡后怎么才能使东西不掉落,游戏中的设定死亡后,你身上的物品会掉落在地上,需要快速的捡回,要不然东西就会消失,那么有没有什么办法可以使死亡后东西不掉落呢. 我的 ...
- ThoughtWorks公司——算法岗位作业题(计算机生成迷宫)
ThoughtWorks公司算法岗位面试经历总结 一.面试的具体流程: 1.面试时间:8月22日(周三)15:00 2.公司地址:成都市高新区天府 ...
- 随机Prim算法生成迷宫
前言 以前写过一篇博客,用栈走迷宫,然后就想着自己生成迷宫,自己走,就上网查了查自动生成迷宫的算法,也是研究了好一会,才用代码实现了这个算法,采用的就是常见的随机Prim算法. 原理 参考博客:htt ...
最新文章
- Git Bash命令行基础
- MVVM Light学习笔记(三):Messenger
- 我思故我在之编程规范及编程思想篇
- java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍
- 云话题 | 你女朋友在买买买时,程序员小哥在干嘛?
- python写配置文件方法_Python读写配置文件的方法
- tomcat启动报错The JRE could not be found.Edit the server and change the JRE location
- 通过Spring Social推特StackExchange –第1部分
- npm安装包总是失败了的,请参考
- java stringbuilder清空_Java中StringBuilder的清空方法比较
- BootstrapTable单元格宽度调整:colResizable()方法
- 设置Visual Studio code停止自动更新
- 智能一代云平台(五):移动开发之环境搭建
- call方法和apply方法
- 优秀ASP.NET程序员的修炼之路(转)
- java的IO操作之--RandomAccessFile
- 英语单词拼写游戏开发纪录
- org.eclipse.jdt版本更新导致包引入问题
- 1+6t刷个lineage OS 20(Android13)
- python爬app_app爬虫(python app爬虫)
热门文章
- oracle nav函数,WordPress函数wp_nav_menu()怎样用_CMS体系建站教程
- 安卓3d游戏引擎_万达院线游戏、莉莉丝推新作;《天龙八部手游》不限号不删档测试开启...
- java实现excel动态表头导入
- python实数符号_下列格式化符号中,用来表示浮点实数的是()。 (6.0分)_学小易找答案...
- uniapp实现退出登录
- 数据可视化平台Superset 简介
- 卷帘快门和全局快门的区别
- mysql身份证号性别_mysql中身份证号判断男女人数
- 路由表的下一跳地址如何计算
- 设置Parallels Desktop中的Windows虚拟机使用Mac宿主机代理