迷宫 填充法新思路(填充干扰路径)

2024-06-15 20:32

本文主要是介绍迷宫 填充法新思路(填充干扰路径),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include<iostream>
#include<string>
using namespace std;
#define n 8int * filler=new int[n*n];//记录填充位置int initFiller(){//初始化填充记录器int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){*(filler+n*i+j)=0;}}return 0;
}int * createMaze(){//初始化迷宫int i,j;int * a;a=new int[n*n];for(i=0;i<n;i++){for(j=0;j<n;j++){*(a+n*i+j)=-1;//不设置为0的原因是超过矩阵范围的位置}				//系统默认的是0,会引起麻烦}*(a+n*0+1)=3;*(a+n*1+1)=1;*(a+n*1+2)=1;*(a+n*1+3)=1;*(a+n*1+5)=1;*(a+n*2+3)=1;*(a+n*2+5)=1;*(a+n*2+6)=1;*(a+n*3+1)=1;*(a+n*3+2)=1;*(a+n*3+3)=1;*(a+n*3+4)=1;*(a+n*3+5)=1;*(a+n*4+1)=1;*(a+n*4+4)=1;*(a+n*5+1)=1;*(a+n*5+2)=1;*(a+n*5+4)=1;*(a+n*5+5)=1;*(a+n*5+6)=1;*(a+n*6+2)=1;*(a+n*6+3)=1;*(a+n*6+4)=1;*(a+n*6+6)=1;*(a+n*7+6)=1;return a;
}void printMaze(int * a){//打印迷宫int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)==1||*(a+n*i+j)==2){cout<<"  ";}else if(*(a+n*i+j)==3){cout<<"★";}else{//*(a+n*i+j)==-1if(*(filler+n*i+j)==1){//后面变成的-1(填充的位置)cout<<"  ";//后来填充的位置设置为不可见}else{//本来就是-1cout<<"■";}}}cout<<endl;}
}int fillInterferePath(int * a){//填充干扰路径int i,j;int * record=new int[n*n];//辅助int flag=0;//设置flag用来判断什么时候终止循环while(flag==0){//用while循环的意义在于通过反复扫描矩阵实现循环填充,以此将所有干扰路径全部填充for(i=0;i<n;i++){for(j=0;j<n;j++){*(record+n*i+j)=*(filler+n*i+j);if(*(a+n*i+j)==1&&*(a+n*i+j-1)==-1&&*(a+n*(i-1)+j)==-1&&*(a+n*(i+1)+j)==-1//为品字形的四个方向||*(a+n*i+j)==1&&*(a+n*i+j-1)==-1&&*(a+n*(i-1)+j)==-1&&*(a+n*i+j+1)==-1||*(a+n*i+j)==1&&*(a+n*i+j+1)==-1&&*(a+n*(i-1)+j)==-1&&*(a+n*(i+1)+j)==-1||*(a+n*i+j)==1&&*(a+n*i+j-1)==-1&&*(a+n*i+j+1)==-1&&*(a+n*(i+1)+j)==-1){*(a+n*i+j)=-1;//将所有品字形路径全部填充,因为这种路径是死路*(filler+n*i+j)=1;}}}flag=1;//当以下两个for循环不再执行时while循环终止for(i=0;i<n;i++){//意义在于用来判断是否还需要进行填充for(j=0;j<n;j++){if(*(record+n*i+j)!=*(filler+n*i+j)){flag=0;}}}}return 0;
}void run(int * a,char ch){int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)==3){switch(ch){case 'w':if(*(a+n*(i-1)+j)==1){//将其限定在通道内*(a+n*i+j)=2;//不走回头路*(a+n*(i-1)+j)=3;return;}else{return;}case 'a':if(*(a+n*i+j-1)==1){*(a+n*i+j)=2;*(a+n*i+j-1)=3;return;}else{return;}case 's':if(*(a+n*(i+1)+j)==1){*(a+n*i+j)=2;*(a+n*(i+1)+j)=3;}else{return;}case 'd':if(*(a+n*i+j+1)==1){*(a+n*i+j)=2;*(a+n*i+j+1)=3;return;}else{return;}default:return;}}}}
}char getDirection(int * a){//得到方向int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)==3){if(*(a+n*i+j+1)==1){//*(a+n*(i-1)+j)==1为了将游戏人物限定在通道之内;return 'd';//1为通道,0为障碍物;}else if(*(a+n*(i+1)+j)==1){return 's';}else if(*(a+n*i+j-1)==1){return 'a';}else if(*(a+n*(i-1)+j)==1){return 'w';}}}}
}int setFiller(int * a,int * b){//填充前与填充后进行比较(为了设置填充标记)int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)!=*(b+n*i+j)){*(filler+n*i+j)=1;//把进行了填充的位置标记起来}}}return 0;
}int * evaluate(int * a){//深拷贝赋值int * b;b=new int[n*n];int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){*(b+n*i+j)=*(a+n*i+j);}}return b;
}//仅实用于通道宽度为1的迷宫,若有些迷宫通道宽
//度大于等于2,该算法有时可能无法处理
int handle(){int * a, * b;int count=1;string step;//用string是为了避免用户多输入字符而引起错误initFiller();a=createMaze();b=evaluate(a);//把a的值依次赋给bfillInterferePath(a);//填充干扰路径setFiller(a,b);printMaze(a);cout<<"请按任意键进行下一步!"<<endl;while(*(a+n*7+6)!=3){cout<<"第"<<count<<"步:";cin>>step;run(a,getDirection(a));printMaze(a);count++;}cout<<"恭喜你,顺利到达终点!"<<endl;return 0;
}int main(){handle();return 0;
}

这篇关于迷宫 填充法新思路(填充干扰路径)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064504

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数