迷宫程序是新手常用的练习算法之一,迷宫生成与循迹的快慢取决于所建立的模型的好坏。本文介绍一种数学模型,用以自动生成(任意规模)的迷宫并可视化寻找最优出路。
废话不多说,都在代码里,原理很简单,可以仔细阅读代码
效果图如下:(迷宫大小可自行设置)

本文代码在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迷宫算法 自动生成迷宫并可视化寻找出路相关推荐

  1. Matlab/Simulink自动生成STM32代码_基于模型的开发_环境搭建

    目录 前言 官方简介 Matlab R2018b安装 STM32-MAT/TARGET 安装 STM32CubeMX 安装 STM32CubeIDE, Keil安装 ST-Link驱动安装 微信公众号 ...

  2. Matlab/Simulink自动生成C代码实验

    目录 0. 概要 1. Matlab /Simulink/Embedded Coder关系与区别 2. 搭建Simulink模型及仿真 2.1 搭建模型 2.2 仿真 3. 生成代码 3.1 求解器设 ...

  3. 利用matlab程序自动生成feko近场云图及matlab程序实现自动化feko运行

    Feko是一款非常实用的电磁仿真软件,目前许多研究的验证及数据的制作都需要借助Feko来实现.但是对于刚入门的同学来说,feko的数据获取比较麻烦,需要在每一次运行结束后手动调节参数再执行下一个运行程 ...

  4. html5 自动生成迷宫,HTML5 Canvas随机迷宫生成动画

    JavaScript 语言: JaveScriptBabelCoffeeScript 确定 class Line { constructor(x, y, a, c) { this.x1 = x; th ...

  5. java迷宫生成代码_maxe.java 源代码在线查看 - Java Maze 计算机自动生成迷宫 资源下载 虫虫电子下载站...

    public class Maxe{ private int startI, startJ; // 入口 private int endI, endJ; // 出口public void setSta ...

  6. Android自动生成Shape资源文件,迈出可视化脚手架第一步(上)

    系列文章目录 第一章:Android自动生成代码,可视化脚手架,将大大提高开发效率 第二章:Android自动生成代码,可视化脚手架之环境搭建 第三章:Android自动生成代码,可视化脚手架之基础信 ...

  7. c语言随机prim算法的迷宫生成,Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

  8. 我的世界服务器物品箱子,我的世界怎么拿完箱子里的东西让他自动生成 | 手游网游页游攻略大全...

    发布时间:2015-11-29 我的世界死亡后怎么才能使东西不掉落,游戏中的设定死亡后,你身上的物品会掉落在地上,需要快速的捡回,要不然东西就会消失,那么有没有什么办法可以使死亡后东西不掉落呢. 我的 ...

  9. ThoughtWorks公司——算法岗位作业题(计算机生成迷宫)

                               ThoughtWorks公司算法岗位面试经历总结 一.面试的具体流程: 1.面试时间:8月22日(周三)15:00 2.公司地址:成都市高新区天府 ...

  10. 随机Prim算法生成迷宫

    前言 以前写过一篇博客,用栈走迷宫,然后就想着自己生成迷宫,自己走,就上网查了查自动生成迷宫的算法,也是研究了好一会,才用代码实现了这个算法,采用的就是常见的随机Prim算法. 原理 参考博客:htt ...

最新文章

  1. Git Bash命令行基础
  2. MVVM Light学习笔记(三):Messenger
  3. 我思故我在之编程规范及编程思想篇
  4. java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍
  5. 云话题 | 你女朋友在买买买时,程序员小哥在干嘛?
  6. python写配置文件方法_Python读写配置文件的方法
  7. tomcat启动报错The JRE could not be found.Edit the server and change the JRE location
  8. 通过Spring Social推特StackExchange –第1部分
  9. npm安装包总是失败了的,请参考
  10. java stringbuilder清空_Java中StringBuilder的清空方法比较
  11. BootstrapTable单元格宽度调整:colResizable()方法
  12. 设置Visual Studio code停止自动更新
  13. 智能一代云平台(五):移动开发之环境搭建
  14. call方法和apply方法
  15. 优秀ASP.NET程序员的修炼之路(转)
  16. java的IO操作之--RandomAccessFile
  17. 英语单词拼写游戏开发纪录
  18. org.eclipse.jdt版本更新导致包引入问题
  19. 1+6t刷个lineage OS 20(Android13)
  20. python爬app_app爬虫(python app爬虫)

热门文章

  1. oracle nav函数,WordPress函数wp_nav_menu()怎样用_CMS体系建站教程
  2. 安卓3d游戏引擎_万达院线游戏、莉莉丝推新作;《天龙八部手游》不限号不删档测试开启...
  3. java实现excel动态表头导入
  4. python实数符号_下列格式化符号中,用来表示浮点实数的是()。 (6.0分)_学小易找答案...
  5. uniapp实现退出登录
  6. 数据可视化平台Superset 简介
  7. 卷帘快门和全局快门的区别
  8. mysql身份证号性别_mysql中身份证号判断男女人数
  9. 路由表的下一跳地址如何计算
  10. 设置Parallels Desktop中的Windows虚拟机使用Mac宿主机代理