【数据结构与算法】迷宫求解------回溯法

news2024/9/21 4:34:44

回溯法

  • 一.迷宫求解算法
  • 二.二维数组表示地图
    • 1.地图
    • 2.初始化地图
    • 3.地图的打印
  • 三.进入迷宫
  • 四.栈的实现
  • 五.迷宫内探
    • 1.首先判断我们的入口
    • 2.入栈做标记
    • 3.开始探险
    • 4.出口判断
    • 5.能否下一步
    • 6.做标记
    • 7.不能下一步
  • 六.运行结果

一.迷宫求解算法

当我们想要找到迷宫的出口,那我们在计算机中,然后操作,可以将每个位置都人栈,然后进行上下左右的路的判断,能否通过,若是死路,就将这个点出栈,回退到刚刚的栈,再判断其他的道路.
这中栈的回退就是回溯法.

二.二维数组表示地图

1.地图

在这里插入图片描述
1表示同路,0表示死路.

2.初始化地图

在这里插入图片描述
地图的结构就是一个二维数组,初始化就是进行赋值.

3.地图的打印

在这里插入图片描述

就是二维数组的打印.

三.进入迷宫

在这里插入图片描述
假设这个位置就是我们的入口.

四.栈的实现

#pragma once
#include <iostream>
using namespace std;
#define MAXSIZE 128

typedef struct ArrayPosition
{
	int a;
	int b;
}ArrayPosition;

typedef ArrayPosition DataType;

typedef struct Stack
{
	DataType* base;
	DataType* top;
}Stack;

bool initStack(Stack& S)
{
	S.base = new DataType[MAXSIZE];
	if (!S.base)return false;
	S.top = S.base;
	return true;
}

bool PushStack(Stack& S, DataType data)
{
	if (S.top - S.base == MAXSIZE)return false;
	*(S.top++) = data;
	return true;
}

bool PopStack(Stack& S, DataType& data)
{
	if (S.top == S.base)return false;
	data = *(--S.top);
	return true;
}

DataType* getElem(Stack& S)
{
	if (S.top != S.base)
	{
		return (S.top - 1);
	}
}

bool isEmpty(Stack& S)
{
	if (S.top == S.base)
	{
		return true;
	}
	else
	{
		return false;
	}
}

这里和我们原来讲的栈都一样,只不过数据变成了二维数组的位置.
在这里插入图片描述
初始化栈就可以进入到我们的迷宫判断了.

五.迷宫内探

1.首先判断我们的入口

在这里插入图片描述
有效的入口是在边界且为通路.

2.入栈做标记

在这里插入图片描述
就当前入口点入栈,然后做标记改为2,就是我们走过的地方.

3.开始探险

while (!isEmpty(*s))
	{
		cur = *getElem(*s);
		if (isValidExit(m, cur, enter))
		{
			return 1;
		}
		//向左
		next = cur;
		next.b = cur.b - 1;
		if (isValidNext(m, cur, next))
		{
			PushStack(*s, next);
			m->map[next.a][next.b] = m->map[cur.a][cur.b] + 1;
			continue;
		}

		//向上
		next = cur;
		next.a = cur.a-1;
		if (isValidNext(m, cur, next))
		{
			PushStack(*s, next);
			m->map[next.a][next.b] = m->map[cur.a][cur.b] + 1;
			continue;
		}

		//向右
		next = cur;
		next.b = cur.b + 1;
		if (isValidNext(m, cur, next))
		{
			PushStack(*s, next);
			m->map[next.a][next.b] = m->map[cur.a][cur.b] + 1;
			continue;
		}

		//向下
		next = cur;
		next.a = cur.a + 1;
		if (isValidNext(m, cur, next))
		{
			PushStack(*s, next);
			m->map[next.a][next.b] = m->map[cur.a][cur.b] + 1;
			continue;
		}

		DataType temp;
		PopStack(*s, temp);
	}
	return 0;
}

只有我们的栈不为空或者找不到出口,那么就一直找.
所以我们先判断是不是出口

4.出口判断

在这里插入图片描述
在边界但不是入口点.
然后对当前上下左右的进行判断能否下一步.

5.能否下一步

在这里插入图片描述
在同行同列且相邻且在二维数组范围内,值为1就是通道就可以下一步.

6.做标记

在这里插入图片描述
能下一步就做标记,入栈.

7.不能下一步

在这里插入图片描述
就出栈,进行判断上一个路口,是否可以其他的下一步.

六.运行结果

在这里插入图片描述

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

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

相关文章

为什么网站要使用HTTPS访问

网站使用HTTPS访问的原因有很多&#xff0c;主要可以归纳为以下几个关键点&#xff1a; 1、数据安全性&#xff1a;HTTPS使用SSL/TLS协议对通信过程进行加密&#xff0c;确保信息在传输过程中不被窃取、篡改或冒充。对于涉及敏感信息&#xff08;如个人身份、信用卡号等&#x…

AnyGPT: Unified Multimodal LLM with Discrete Sequence Modeling

发表时间&#xff1a;arXiv 2024年2月26日 论文链接&#xff1a;https://arxiv.org/pdf/2402.12226 作者单位&#xff1a; Fudan University Motivation&#xff1a; LLM 在理解和生成人类语言方面表现出非凡的能力。但是&#xff0c;LLM 的能力仅限于针对文本的处理。而现实…

JVM系列 | 对象的消亡2——HotSpot的设计细节

HotSpot 的细节实现 文章目录 HotSpot 的细节实现OopMap 与 根节点枚举根节点类型及说明HotSpot中的实现 OopMap 与 安全点安全点介绍如何保证程序在安全点上&#xff1f; 安全区域记忆集与卡表记忆集卡表 写屏障并发的可达性分析&#xff08;与用户线程&#xff09;并发可达性…

Spring boot框架指南

1. Spring Boot 概述 1.1 定义与起源 Spring Boot是一种基于Spring框架的开源框架&#xff0c;旨在简化Spring应用程序的创建和开发过程。它通过提供一系列默认配置和自动配置功能&#xff0c;减少了开发者在配置上的工作量&#xff0c;使得快速搭建生产级别的Spring应用程序…

OV SSL证书优势及获取渠道

OV证书&#xff0c;即组织验证型SSL证书&#xff0c;通过严格的组织审查流程&#xff0c;为网站提供数据传输加密、身份验证和信息完整性保护。 OV证书优势 1 高信任度 OV证书通过证书颁发机构&#xff08;CA&#xff09;对企业实名认证&#xff0c;包括企业名称、注册地址、…

万能门店小程序开发平台功能源码系统 带完整的安装代码包以及安装搭建教程

互联网技术的迅猛发展和用户对于便捷性需求的不断提高&#xff0c;小程序以其轻量、快捷、无需安装的特点&#xff0c;成为了众多商家和开发者关注的焦点。为满足广大商家对于门店线上化、智能化管理的需求&#xff0c;小编给大家分享一款“万能门店小程序开发平台功能源码系统…

kernel32.dll丢失?那么kernel32.dll如何修复?教你几种修复丢失kernel32.dll错误的方法

在使用电脑时你是否遇到过kernel32.dll丢失的情况&#xff0c;那么遇到这种情况应该如何解决呢&#xff1f;遇到kernel32.dll丢失就会导致电脑无法正常运行&#xff0c;应用程序也会无法正常使用&#xff0c;今天就教大家kernel32.dll丢失的解决办法。 几种解决kernel32.dll丢失…

破解USB设备通讯协议实现自定义软件控制的步骤与方法

在设备和计算机之间通过USB进行通讯的情况下&#xff0c;厂家提供的软件可以控制设备&#xff0c;但没有提供任何其他资料和支持&#xff0c;这种情况下&#xff0c;若希望自行开发软件来实现同样的功能&#xff0c;可以通过以下步骤破解通讯协议并开发自定义程序。 1. 捕获US…

干货!如何选择Ai大模型(LLMs)?

过去一年里&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在人工智能界风起云涌&#xff0c;纷纷以突破性的进步拓展生成式人工智能的可能性。新模型层出不穷&#xff0c;令人目不暇接。 这些模型依靠日益增长的参数数量和庞大的数据集进行训练&#xff0c;显著提升了…

CentOS版本的Linux系统误删了自带的python和yum,恢复过程

文章借鉴于&#xff1a;Centos误删自带python2.7恢复方法_centos默认的被卸载了-CSDN博客 在进行别的操作的时候&#xff0c;一不小心将我的系统自带的Python2.7.5和yum删除掉了。 后来我尝试重新安装yum&#xff0c;但是安装yum必须要有python。 我又去重新安装了python&am…

前端面试:项目细节重难点问题分享(16)

&#x1f481;&#x1f481;更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&…

数据库|SQLServer数据库:数据的基本查询

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 其实对于数据库的查询以前也应用过&#xff0c;只是使用时一般也是根据要实现的要求从网上搜索&#xff0c;能实现应用要求即可&#xff0c;现在根据视频学习&#xff0c;正好有这么一节&#xff0c;就听一遍&#xff…

ROS 2 话题:使用C++进行发布与订阅

ROS 2 话题&#xff1a;使用C进行发布与订阅 ROS 2提供了一种强大而灵活的通信机制&#xff0c;称为话题&#xff08;Topics&#xff09;。话题允许节点之间进行异步消息传递&#xff0c;从而实现松耦合的通信模式。在本文中&#xff0c;我们将介绍如何使用C编程语言在ROS 2中…

常见中间件漏洞大全及其修复方法(未完成)

一.Tomcat tomcat 是一个开源而且免费的 jsp 服务器&#xff0c;默认端口 : 8080 &#xff0c;属于轻量级应用服务器。它可以实现 JavaWeb程序的装载&#xff0c;是配置 JSP &#xff08; Java Server Page &#xff09;和 JAVA 系统必备的一款环境。 1.1 CVE-2017-12615 Tomc…

Transformers 中的Softmax 和 Layer Norm 如何并行?

1.Softmax 如何并行&#xff1f; Softmax 计算公式&#xff1a; 安全的 Softmax 运算&#xff1a; softmax 有个问题&#xff0c;那就是很容易溢出。比如采用半精度&#xff0c;由于float16的最大值为65504&#xff0c;所以只要x>11&#xff0c;那么softmax就溢出了。即使是…

C语言新手小白详细教程(6)函数

希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明为什么要使用函数&#xff1f;1.定义一个函数2.调用函数3.定义函数详解 开篇说明 截止目前&#xff0c;我们已…

华清IOday7 24-8-5

文章目录 使用有名管道实现&#xff0c;一个进程用于给另一个进程发消息&#xff0c;另一个进程收到消息后&#xff0c;展示到终端上&#xff0c;并且将消息保存到文件上一份使用有名管道实现两个进程间相互通信 使用有名管道实现&#xff0c;一个进程用于给另一个进程发消息&a…

服务器数据恢复—raid5阵列上层Oracle数据库数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器上有8块SAS硬盘&#xff0c;其中的7块硬盘组建了一组RAID5阵列&#xff0c;另外1块硬盘作为热备盘使用。划分了6个LUN&#xff0c;服务器上部署有oracle数据库。 RAID5磁盘阵列中有2块硬盘出现故障并离线&#xff0c;RAID5阵…

浮点数在计算机中的编码方式

一、前言 我们常能听到&#xff0c;直接用浮点数做运算得出的结果是不准确的了&#xff1b;或者也能看到涉及到浮点数时&#xff0c;会出现一些奇奇怪怪的问题&#xff0c;比如&#xff1a; public class DecimalTest {public static void main(String[] args) {float f1 1.…

STK12.2+Python开发(二):添加访问约束,新建场景、卫星、地面站等,获取当前场景的信息

新建场景 1.获取当前打开的场景 #获取当前打开的场景 scenario root.CurrentScenario2.设置当前场景的时间 scenario.SetTimePeriod(Today,24hr)3.添加一个地面目标到当前的场景 scenario.SetTimePeriod(Today,24hr)4.添加一个地面目标到当前的场景&#xff0c;括号内是三…