分支限界法求解迷宫问题

问题描述

从入口出发,按某一方向向前探索,若能走通(未走过的),即某处可以到达,则到达新点,否则试探下一方向;若该点所有的方向均没有通路,则沿原路返回到前一点,换下一个方向再继续试探,直到所有可能的通路都探索到,或找到一条通路,或无路可走又退回到入口点。
退回到的“前一点”正是刚刚才被访问过的,具有“后进先出”的特性,需要用栈保存所能够到达的每一点的下标及从该点前进的方向。

请添加图片描述

迷宫问题数据结构

用二维数组maze[M][N]来表示迷宫,图中红框内的部分为迷宫,而迷宫的四周的值全部为1(即不通)。这样设计的话,将迷宫中所有点都演变成迷宫中部的某点,可以保证无论哪个点的试探方向都是4个
在这里插入图片描述

方向试探表示

typedef struct{//x,y方向的向量int incX,intcY; 
} Direction;
Direction direct[4];
//从某点(x,y)按某一方向v(0<=v<=3)达到新的点(line,col)的坐标
line=x+direct[v].incX;
col=y+direct[v].intcY;

在这里插入图片描述

栈中元素的组织

typedef struct{int x,y;//当前访问的迷宫格子的横纵坐标 int direction;//当前方向 
}Box; 

防止重复到达某点

方案一:

  • 另外设置标志数组flag[m][n],其所有元素初始化为0,当达到某一点(i,j)时,将其对应的flag[i][j]设置为1,下次试探到该位置时,就不能选它了。
    方案二

  • 当到达某点(i,j)后将对应maze[i][j]设置为-1,其它点未到达过的点其值只能是1或0,可与未到达过的点区别开

代码实现

在这里插入图片描述

#include<stdio.h>
#define MAXQ 100
#define MAZN 10
//初始化迷宫 
int n=8;
char Maze[MAZN][MAZN]={{'0','1','1','1','1','1','1','1'},{'0','0','0','0','0','1','1','1'},{'1','0','1','1','0','0','0','1'},{'1','0','1','1','0','1','1','0'},{'1','0','1','1','1','1','1','1'},{'1','0','1','1','0','0','0','1'},{'1','0','0','0','0','1','0','0'},{'1','1','1','1','1','1','1','0'}
};//方向结构体 struct Direction{int incX,incY;};Direction dir[4]={{0,-1},{1,0},{0,1},{-1,0}}; //当前位置,探索的方向 struct Position{int x,y;int pre;};Position qu[MAXQ];//队头和队尾 int front=-1,rear=-1;//输出迷宫路径 void disppath(int front){int i,j;//之前走过设置为-1的都还原为0 for(i=0;i<n;i++)for(j=0;j<n;j++)if(Maze[i][j]=='-1')Maze[i][j]='0';int k=front;//能走通的路径设置为空 while(k!=-1){Maze[qu[k].x][qu[k].y]=' ';k=qu[k].pre;}//遍历出该路径 for(i=0;i<n;i++){printf(" ");for(int j=0;j<n;j++)printf("%c",Maze[i][j]);printf("\n");}//输出路径具体位置for(i=0;i<n;i++){for(int j=0;j<n;j++)if(Maze[i][j]==' ')printf("(%d,%d)-->",i,j); } printf("End");}//广度优先遍历 void BFS(int x,int y){Position p,p1,p2;p.x=x;p.y=y;p.pre=-1;//走过的位置为-1,下次不能再走了 Maze[p.x][p.y]='-1';//队尾++ rear++;//更新当前解 qu[rear]=p;while(front!=rear){//队头++ front++;p1=qu[front];//找到一条通路,输出路径 if(p1.x==n-1&&p1.y==n-1){disppath(front);return;}//试探上,右,下,左四个方向(0,-1)(1,0)(0,1)(-1,0) for(int k=0;k<4;k++){p2.x=p1.x+dir[k].incX;p2.y=p1.y+dir[k].incY;//满足,不能为负,不能超出迷宫,要是通路 if(p2.x>=0&&p2.y>=0&&p2.x<n&&p2.y<n&&Maze[p2.x][p2.y]=='0'){//该位置走过为-1 Maze[p2.x][p2.y]='-1';//更新方向 p2.pre=front;rear++;//入队 qu[rear]=p2;}}}}int main(){int x=0,y=0;printf("迷宫路径:\n");BFS(x,y);return 0;}
迷宫路径:11111111111111 1111111 1111101 1111111 11   11    11111111(0,0)-->(1,0)-->(1,1)-->(2,1)-->(3,1)-->(4,1)-->(5,1)-->(5,4)-->(5,5)-->(5,6)-->(6,1)-->(6,2)-->(6,3)-->(6,4)-->(6,6)-->(6,7)-->(7,7)-->End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现招聘信息管理系统项目【项目源码+论文说明】

基于springboot实现招聘信息管理系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括招聘信息管理系统的网络应用&#xff0c;在外国招聘信息管理系统已经是很普遍的方式&#xff0c;不过国内的线上管理系统可能还…

野火霸天虎 STM32F407 学习笔记_3 尝试寄存器映射方式点亮 LED 灯

新建工程 寄存器方式 要命啊&#xff0c;一看名字我就不想试。寄存器新建不得麻烦死。 哎算了为了学习原理&#xff0c;干了。 我们尝试自己写一个寄存器的库函数来引用。 首先我们需要引用 st 官方启动文件 stmf4xx.s&#xff0c;具体用途后面章节再展开讲解。然后我们自…

算法打卡01——求两数之和

题目&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你…

NtripShare Caster高精度定位CORS服务软件

NtripShare CORS是NtripShare GNSS系列软件中最早的软件系统&#xff0c;也是NtripShare名称的起源。 所谓GNSS CORS服务系统一般构成&#xff1a; 1&#xff09;基准站网&#xff1a;由若干个分布合理的GNSS 基准站组成&#xff1b; 2&#xff09;数据传输系统&#xff1a;…

贰[2],OpenCV函数解析

1&#xff0c;imread&#xff1a;图片读取 CV_EXPORTS_W Mat imread( const String& filename, int flags IMREAD_COLOR );//参数1(filename)&#xff1a;文件地址 //参数2(flags):读取标志 注:ImreadModes&#xff0c;参数2(flags)枚举定义 enum ImreadModes { IMREAD…

Android 接入ttf字体文件

一、业务实现 一些炫酷的App总会加一些App自己的字体。这时候需要找UI提供ttf字体文件。 然后实现 TTF&#xff08;TrueType Font&#xff09;字体文件并将其应用到 TextView。 二、大致流程 将 TTF 字体文件添加到你的 Android 项目中&#xff1a; 将 TTF 文件复制到 res/f…

K8S知识点(六)

&#xff08;1&#xff09;资源管理方式1 其他参数 其他参数以json格式显示pod信息 以yaml显示pod信息&#xff1a; 用describe描述容器的详细信息&#xff1a;包括ip啊&#xff0c;镜像啊&#xff0c;端口啊&#xff0c;容器启动经历的历程 创建命名空间Pod&#xff1a; 查询…

Excel文档名称批量翻译的高效方法

在处理大量文件时&#xff0c;我们常常需要借助一些工具来提高工作效率。例如&#xff0c;在需要对Excel文档名称进行批量翻译时&#xff0c;一个方便快捷的工具可以帮助我们省去很多麻烦。今天&#xff0c;我将介绍一款名为固乔文件管家的软件&#xff0c;它能够帮助我们轻松实…

解决 SSLError: HTTPSConnectionPool(host=‘huggingface.co‘, port=443)

看我的回答&#xff1a; https://github.com/huggingface/transformers/issues/17611#issuecomment-1794486960 能问这个问题的都是网络不太好的&#xff0c;你懂的&#xff0c;所以答案全是解决网络的。 得益于这个回答&#xff1a;#17611 (comment) 看了一下代码&#xf…

The valid characters are defined in RFC 7230 and RFC 3986

服務器通過Body 對象接收參數&#xff0c;而客戶端通過param 地址URL傳參數&#xff0c;不能解析。 return axiosHelper<Protocol<ABC[]>>({method: POST,url: ,data: _reqparams: {data: _req}}) public List<InvoiceItem> getAAAA(RequestBody Query quer…

ElementUI-tree拖拽功能与节点自定义

前言 在管理端会遇到多分类时&#xff0c;要求有层次展示出来&#xff0c;并且每个分类有额外的操作。例如&#xff1a;添加分类、编辑分类、删除、拖到分类等。 下面将会记录这样的一个需求实习过程。 了解需求 分类展示按层级展示分类根据特定的参数展示可以操作的按钮&a…

C语言——switch语句判断星期

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int day 0;scanf("请输入1-7之间的整数&#xff1a;%d",&day);switch(day){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf(&quo…

Java基于springboot开发的景点旅游项目

演示视频 https://www.bilibili.com/video/BV1cj411Y7UK/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 主要功能&#xff1a;用户可浏览搜索旅游景点&#xff08;分为收费和免费景点&#xff09;&#xff0c;购票&#xff08;支持多规格套餐购票&am…

【Node.js入门之—1.1Node.js 简介】

Node.js入门之—1.1Node.js 简介 文章目录 Node.js入门之—1.1Node.js 简介什么是 Node.js错误说法 Node.js 的特点跨平台三方类库自带http服务器非阻塞I/O事件驱动单线程 Node.js 的应用场合适合用Node.js的场合不适合用Node.js的场合弥补Node.js不足的解决方案 什么是 Node.j…

cordova Xcode打包ios以及发布流程(ionic3适用)

第一步 1、申请iOS证书 2、导入证书到钥匙串 第二步 1、xcode配置iOS证书 1.1用Xcode打开你的项目&#xff08;我的Xcode版本是新版&#xff09; 修改如下图 回到基本信息设置界面&#xff0c;Bundie 这项填写&#xff0c;最先创建的那个appid&#xff0c;跟创建iOS描述文件时选…

决策式AI与生成式AI

人工智能中深度学习&#xff0c;是一种受人脑的生物神经网络机制启发&#xff0c;并模仿人脑来解释、处理数据的机器学习技术&#xff0c;它能自动对数据进行特征提取、识别、决策和生成。它可以从不同的维度进行划分&#xff0c;如果按模型的特点来划分可分为决策式AI和生成式…

2023年中国金融控股公司研究报告

第一章 行业概况 1.1 定义 金融控股公司这一术语最初源自美国&#xff0c;特别是在美国的《金融服务法案》关于银行控股公司组织结构的条文中&#xff0c;首次出现了“金融控股公司”&#xff08;Financial Holding Company&#xff09;这一法律术语&#xff0c;尽管法案中并…

红黑数原理及存在原因

我红黑树那么牛&#xff0c;你们为什么不用&#xff1f;_哔哩哔哩_bilibili 面试时经常会被问到红黑树&#xff0c;它到底有什么优点呢&#xff1f; 对于查找数据&#xff0c;数组二分查询速度最快&#xff0c;时间复杂度为O(logN)。但是如果增加和删除数据&#xff0c;数组就…

ARMday02(汇编语法、汇编指令)

汇编语法 汇编文件中的内容 1.伪操作&#xff1a;在汇编程序中不占用存储空间&#xff0c;但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word.... 2.汇编指令&#xff1a;每一条汇编指令都用来标识一个机器码&#xff0c;让计算机做…

深度学习中的数据类型介绍:FP32, FP16, TF32, BF16, Int16, Int8 ...

文章目录 0. 前言1. 数据的存储方式2. 不同数据类型介绍2.1 深度学习中常用的数据类型2.2 BF16 类型的优势2.3 不同数据类型的使用场景 0. 前言 相比于 CPU&#xff0c;GPU 在架构设计时将更多的晶体管用于数据处理&#xff0c;而不是数据缓存和流量控制&#xff0c;因此可以高…