分支限界法求解迷宫问题

news2024/11/16 0:31:14

问题描述

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

请添加图片描述

迷宫问题数据结构

用二维数组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;
	}
迷宫路径:
  1111111
   111111
 1 111111
 1 111110
 1 111111
 1 11   1
 1    1
 1111111
 
(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.coloradmin.cn/o/1181517.html

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

相关文章

一台抵得上多种测量仪器-B1500A半导体参数分析仪

一台抵得上多种测量仪器-B1500A半导体参数分析仪 B1500A 半导体器件分析仪 卓越的测量能力&#xff0c; 完美的一体化解决方案&#xff0c; 经济高效, 出色的软件。 #B1500A 3步表征设备 使用B1500A半导体参数分析仪或PC上随附的EasyEXPERT group 表征软件。EasyEXPERT …

如何卸载在linux下通过rpm安装的mysql

目录 1.先关闭MySQL服务并查看运行状态 2.使用 rpm 管道命令的方式查看已安装的mysql 3. 使用rpm -ev 命令移除安装 4. 删除MySQL数据库内容 1.先关闭MySQL服务并查看运行状态 如果之前安装过并已经启动&#xff0c;则需要卸载前请先关闭MySQL服务 systemctl stop mysqld…

Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845)

Juniper Networks Junos OS EX远程命令执行漏洞&#xff08;CVE-2023-36845&#xff09; 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: body"J-web" || title"Juniper Web Device Manager" 漏洞复现1. 构造poc2. 查看文件3. 执行命令 免责声明 仅用于技…

【编译原理】LL(1)文法

文章目录 语法分析基本概念自上而下语法分析自上而下语法分析的问题 消除文法左递归消除直接左递归消除间接左递归消除左递归的算法 解决回溯问题FIRST集与提出公共左因子FIRST集提取左公共因子 FOLLOW集合 构造FIRST集和FOLLOW集构造FIRST集合构造每个文法符号的FIRST集合构造…

新书稿费终于下来了!你猜有多少?

我的新书《从零开始学ARM》从正式出版到现在已经有半年时间了&#xff01; 第一批印刷的几千册已经基本销售完&#xff0c; 第二版会对其中勘误进行修正&#xff0c;并继续继续印刷。 前两年写书、审稿&#xff0c; 所有业余时间都耗在这上面了&#xff0c; 在下面这篇文章…

人大金仓KingbaseES_V008R006C008B0014安装

人大金仓安装 一、安装前准备工作 1、硬件环境要求 KingbaseES支持通用X86_64、龙芯、飞腾、鲲鹏等国产CPU硬件体系架构。 2、软件环境要求 KingbaseES支持各种主流的Linux操作系统64位发行版本&#xff0c;包括CentOS、中标麒麟、银河麒麟、统信UOS、Deepin、凝思、中科方…

基于springboot+vue开发的教师工作量管理系

教师工作量管理系 springboot31 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统的开发全过程。通过分析教师工作量管理系统管理的不足&#xff0c;创建了一个计算机管理教师工作量管理系…

EtherCAT转EtherNET/IP协议网关控制EtherCAT伺服驱动器的方法

只需一步&#xff0c;将你的EtherCAT协议设备转换为EthernetIP协议&#xff01; 捷米特JM-ECTM-EIP网关&#xff0c;这款专为EtherCAT协议设备设计的转接装置&#xff0c;可以轻松地将EtherCAT设备数据采集的数据转换成EthernetIP协议。而且&#xff0c;我们的网关接口非常灵活…

同星智能亮相2023北美汽车测试展,国产替代的前方是“星辰大海”!

01 圆满落幕 2023年10月24日至10月26日&#xff0c;为期三天的2023北美汽车测试展览会&#xff08;Automotive Testing Expo&#xff09;在美国密歇根 Surburban Collection Showplace 成功举行。同星智能作为一家具备全球影响力的中国工业软件企业亮相了本次展会&#xff0c;…

聊一聊 tcp/ip 在.NET故障分析的重要性

一&#xff1a;背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后&#xff0c;真的越来越体会到计算机基础课的重要&#xff0c;比如 计算机网络 课&#xff0c;如果没有对 tcpip协议 的深刻理解&#xff0c;解决这些问题真的很难&#xff0c;因为你只能在高层…

linux 安装 Anaconda3

文章目录 一、下载二、安装1.使用xftp把下载包拉到服务器上2.执行安装命令3、在安装时没有自动添加环境变量&#xff0c;这里手动设置3.1.1通过修改~/.bashrc来配置环境变量3.1.2 重新载入配置文件3.1.3 测试 一、下载 官网下载链接 二、安装 1.使用xftp把下载包拉到服务器上…

安装RabbitMQ

安装RabbitMQ 下载需要的两个包 # 这直接就可以安装了&#xff0c;下面 ‘上传对应的rmp包’ 操作 [rootrabbitmq-1 ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash [rootrabbitmq-1 ~]# yum install erlang-21.3.8.2…

linux继续循环案例测试ping网络,目录下的文件权限循环输出

第一&#xff1a;查看本机ip #ip addr 通过脚本访问本机ip1-100&#xff0c;是否可以ping通&#xff0c;并显示结果&#xff0c;上图 知识点 ping -c 数字1 -w 数字1&#xff0c;向目的ip发送1个数据包&#xff0c;等待1秒&#xff0c;无回复中止 &>/dev/null 知…

python 之生成器表达式,以及与列表推导式的区别

文章目录 生成器表达式基本结构示例生成一个简单的生成器遍历生成器并获取值使用条件过滤 优点 生成器表达式与列表推导式的区别1. 返回类型2. 生成方式3. 内存占用4. 访问方式示例总结 生成器表达式是一种在 Python 中用来创建生成器的高效方法。生成器表达式和列表推导式类似…

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…

Ubuntu 22.04.3 LTS中安装singularity

文章目录 概要背景知识什么是singularity ? 安装流程1. 安装Go2. 下载Singularity3. 编译Singularity源代码 4. 验证安装是否成功singularity的使用安装open structure 小结 概要 这里主要记录singularity的安装和使用&#xff0c;安装过程中会出现相关的错误&#xff0c;所以…

redis: 记录一次线上redis内存占用过大问题解决过程

引言 记录一次线上redis占用过大的排查过程&#xff0c;供后续参考 问题背景 测试同事突然反馈测试环境的web系统无法登陆&#xff0c;同时发现其他子系统也存在各类使用问题 排查过程 1、因为首先反馈的是测试环境系统无法登陆&#xff0c;于是首先去查看了登陆功能的报错…

阿里微服务质量保障系列:故障演练

对于很多大型企业(如阿里巴巴)来说,经过多年的技术演进,系统工具和架构已经高度垂直化,服务器规模也达到了比较大的体量。当服务规模大于一定量(如10000台)时,小概率的硬件故障每天都会发生。这时如果需要人的干预,系统就无法可靠的伸缩。 为此每一层的系统都会面向失…

数据库SQL

数据库&SQL 数据库基本概念数据库DataBase定义 数据库管理系统(DBMS)定义在JAVA项目中与数据库的结合数据库管理系统中常见的概念库与表的关系 SQL数据类型数字类型浮点类型字符类型TEXT类型日期类型 SQL语言的分类DDL:数据定义语言修改表结构的注意事项 DML:数据操作语言D…

关于卷积神经网络的池化层(pooling)

了解池化层 池化层又称“下采样层”或“子采样层”&#xff0c;池化层可以大大降低特征的维度&#xff0c;减少计算量&#xff0c;同时可以避免过拟合问题。 顾名思义&#xff0c;最大池化层就是从输入的矩阵中某一范围内&#xff0c;选择最大的元素进行保留&#xff1b;平均池…