利用栈来破解迷宫问题

2023-11-06

利用栈来破解迷宫问题

在这里插入图片描述

对于迷宫类问题的破解,需要利用栈的思想
1.构思
假设“当前位置”指的是在搜索过程中某一时刻所在途中某个方块的位置,“路径是最优走法”则求迷宫当中一条路径的思想便是:若当前位置可以通过,那么存放在“路径”中,可以通过的位置便是没有走过的位置,因为路径记录的是每一步,并朝向下一个位置进行探索,切换下一个位置为当前位置。把当前位置用一个数组表示,然后判断放入路径然后用栈存放,那么放进去一个位置就代表走过了那个位置。那肯定有很多重复,也会往回走但,那么如何实现走出迷宫呢?
2.算法
每次走一个位置,就进行判断。如果当前位置可通(可通的概念便是可以走,并且没有走过该位置)那么存入路径中,如果当前位置不可通,那么取出栈中栈顶元素,也就是上一个位置,转一下向,按顺时针(1为右,2为下,3为左,4为上),然后再走,再来判断是否可通,要是四个方向都判断了也就是走完该位置的所有走法了还是没有可以通的位置,那么取出删除,然后再取栈顶,然后继续判断,那么就相当于后退一格到前一个位置,然后继续判断。

假设当前位置的初值为入口位置
do{
    if(当前位置可通){
    将该位置插入栈顶
    若是出口位置,则走完
    }
    else{
    if(若栈不空并且四周都不通){
    删除栈顶元素
    }
    if(栈不空并且四周还能走){
    那么改变方向继续走
    }
    }
}while(栈不空)

代码如下

#include"consts.h"
typedef struct {
	int ord;           //通道块在路径上的序号
	int seat[2];       //通道块在迷宫中的位置
	int di;            //记录此通道块走向下一通道块的方向
}SElemType;
int top = -1;
SElemType Q[100];
int map[10][10] = { 0 };
int foot[200][2] = { 0 };
int l1 = -1;
int badfoot[100][2] = { 0 };
int l2 = -1;


void Push(SElemType* Q, SElemType* e) {
	if (top == 100) {
		printf("栈满");
		exit(0);
	}
	else {
		top++;
		Q[top] = *e;
	}
	int xx, yy;
	for (int i = 0; i <= top; i++) {
		xx = Q[i].seat[0];
		yy = Q[i].seat[1];
	}
}

void Pop(SElemType* Q, SElemType* e) {
	if (top == -1) {
		printf("栈空");
		exit(0);
	}
	else {
		*e = Q[top];
		top--;
	}
}


int StackEmpty(SElemType* Q) {
	if (top == -1)return 1;
	else return 0;
}

int Pass(int curpos[]) {
	int x = curpos[0];
	int y = curpos[1];
	if (map[y][x] == 1)return 0;
	for (int i = 0; i <= top; i++) {
		if (Q[i].seat[0] == x && Q[i].seat[1] == y) {
			return 0;
		}
	}
	return 1;
}

void FootPrint(int curpos[]) {
	l1++;
	foot[l1][0] = curpos[0];
	foot[l1][1] = curpos[1];
}

int* NextPos(int curpos[], int e) {
	if (e == 1) {
		int x = curpos[0] + 1;
		int y = curpos[1];
		int newcur[2];
		newcur[0] = x;
		newcur[1] = y;
		return newcur;
	}
	else if (e == 2) {
		int x = curpos[0];
		int y = curpos[1] + 1;
		int newcur[2];
		newcur[0] = x;
		newcur[1] = y;
		return newcur;
	}
	else if (e == 3) {
		int x = curpos[0] - 1;
		int y = curpos[1];
		int newcur[2];
		newcur[0] = x;
		newcur[1] = y;
		return newcur;
	}
	else if (e == 4) {
		int x = curpos[0];
		int y = curpos[1] - 1;
		int newcur[2];
		newcur[0] = x;
		newcur[1] = y;
		return newcur;
	}
	else return curpos;
}
void MarkPrint(int curpos[]) {
	l2++;
	badfoot[l2][0] = curpos[0];
	badfoot[l2][1] = curpos[1];
}
int main() {
	int win = 0;
	SElemType* S, * e;
	S = (SElemType*)malloc(sizeof(SElemType));
	e = (SElemType*)malloc(sizeof(SElemType));
	if (S) {
		map[1][3] = 1;
		map[1][7] = 1;
		map[2][3] = 1;
		map[2][7] = 1;
		map[3][5] = 1;
		map[3][6] = 1;
		map[4][2] = 1;
		map[4][3] = 1;
		map[4][4] = 1;
		map[5][4] = 1;
		map[6][2] = 1;
		map[6][6] = 1;
		map[7][2] = 1;
		map[7][3] = 1;
		map[7][4] = 1;
		map[7][6] = 1;
		map[7][7] = 1;
		map[8][1] = 1;
		map[1][1] = 2;
		map[8][8] = 3;
		for (int i = 0; i < 10; i++) {
			map[0][i] = 1;
			map[9][i] = 1;
			map[i][0] = 1;
			map[i][9] = 1;
		}
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				if (map[i][j] == 1)
					printf("*");
				else if (map[i][j] == 2)
					printf("&");
				else if (map[i][j] == 3)
					printf("$");
				else printf(" ");
			}
			printf("\n");
		}
		int curpos[2] = { 1,1 };      //设定当前位置为起始位置
		int curstep = 1;              //探索第一步
		do {
			if (Pass(curpos)) {
				FootPrint(curpos);
				S->seat[0] = curpos[0];
				S->seat[1] = curpos[1];
				S->di = 1;
				S->ord = curstep;
				Push(Q, S);
				int x = curpos[0];
				int y = curpos[1];
				if (map[y][x] == 3) {
					printf("已经出去了\n");
					win = 1;
				}
				int x1 = NextPos(curpos, 1)[0];
				int y1 = NextPos(curpos, 1)[1];
				curpos[0] = x1;
				curpos[1] = y1;
				curstep++;
			}
			else {
				if (!StackEmpty(Q)) {
					Pop(Q, e);
					while (e->di == 4 && !StackEmpty(Q)) {
						MarkPrint(e->seat);
						Pop(Q, e);
					}
					if (e->di < 4) {
						e->di = e->di + 1;
						Push(Q, e);
						int x1 = NextPos(e->seat, e->di)[0];
						int y1 = NextPos(e->seat, e->di)[1];
						curpos[0] = x1;
						curpos[1] = y1;
					}
				}
			}
		} while (!StackEmpty(Q) && win == 0);
		printf("成功破解!\n破解路径:");
		int xx, yy;
		for (int i = 0; i <= top; i++) {
			xx = Q[i].seat[0];
			yy = Q[i].seat[1];
			printf("[%d,%d] ", xx, yy);
		}
		printf("\n破解过程走过的位置:");
		for (int j = 0; j <= l1; j++) {
			printf("[%d,%d]", foot[j][0], foot[j][1]);
		}
	}
}

补充:头文件

#pragma once
#include<stdio.h>                        //EOF(=^Z或F6),NULL
#include<malloc.h>                       //malloc()等
#include<limits.h>                       //INT_MAX等
#include<string.h>                       
#include<stdlib.h>                       //atoi()
#include<io.h>                           //eof
#include<math.h>                         //floor(),ceil(),abs()*
#include<process.h>                      //exit()*
/*函数结果状态代码*/
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define INFEASIBLE -1




在这里插入图片描述

该算法可以实现大部分迷宫的破解,算法比较简单,如果大佬有更简单的算法,欢迎私聊!

本人在校大学生,菜鸟学习中,欢迎大佬指导,欢迎大家点赞关注!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用栈来破解迷宫问题 的相关文章

  • 浅谈归并排序:合并 K 个升序链表的归并解法

    在面试中遇到了这道题 如何实现多个升序链表的合并 这是 LeetCode 上的一道原题 题目具体如下 用归并实现合并 K 个升序链表 LeetCode 23 合并K个升序链表 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到
  • 工业异常检测AnomalyGPT-Demo试跑

    写在前面 如果你有大的cpu和gpu可以使用 直接根据官方的安装说明就可以 如果没有 可以点进来试着看一下我个人的安装经验 一 试跑环境 NVIDIA4090显卡24g cpu内存33G 交换空间8g 操作系统ubuntu22 04 试跑过
  • 华为OD机试真题-围棋的气-2023年OD统一考试(C卷)

    题目描述 围棋棋盘由纵横各19条线垂直相交组成 棋盘上一共19x19 361个交点 对弈双方一方执白棋 一方执黑棋 落子时只能将棋子置于交点上 气 是围棋中很重要的一个概念 某个棋子有几口气 是指其上下左右方向四个相邻的交叉点中 有几个交叉
  • 【质量-弹簧-阻尼系统】基于脉冲响应约束的子空间辨识研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

    Retrieval Augmented Generation RAG 是一种强大的技术 能够提高大型语言模型 LLM 的性能 使其能够从外部知识源中检索信息以生成更准确 具有上下文的回答 本文将详细介绍 RAG 在 LangChain 中的
  • J2EE常见面试题(一)

    StringBuilder和StringBuffer的区别 String 字符串常量 不可变 使用字符串拼接时是不同的2个空间 StringBuffer 字符串变量 可变 线程安全 字符串拼接直接在字符串后追加 StringBuilder
  • 排序:计数排序

    一 概念 计数排序是非比较排序 是对哈希直接定址法的变形应用 二 思想 利用数组统计相同数据出现的次数 例如整型数据m出现n次 就在数组m位置记录数据为n 最后从头遍历数组打印数据即可 通俗来讲就是 数组下标即为数据 下标所指位置的值即为数
  • 【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 有 无策略奖励 2 2 训练结果1
  • 2024年华为OD机试真题-小明找位置-Java-OD统一考试(C卷)

    题目描述 小朋友出操 按学号从小到大排成一列 小明来迟了 请你给小明出个主意 让他尽快找到他应该排的位置 算法复杂度要求不高于nLog n 学号为整数类型 队列规模 lt 10000 输入描述 1 第一行 输入已排成队列的小朋友的学号 正整
  • C和指针课后答案

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 第八章课后答案 提示 以下是本篇文章正文内容 下面案例可供参考
  • 206.翻转链表

    翻转链表 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 备战技术面试 力扣提供海量技术面试资源 帮助你高效提升编程技能 轻松拿下世界 IT 名企 Dream Offer https leetcode cn problems re
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 2024年华为OD机试真题-手机App防沉迷系统-Java-OD统一考试(C卷)

    题目描述 智能手机方便了我们生活的同时 也侵占了我们不少的时间 手机App防沉迷系统 能够让我们每天合理的规划手机App使用时间 在正确的时间做正确的事 它的大概原理是这样的 1 在一天24小时内 可注册每个App的允许使用时段 2 一个时
  • 矩阵基本操作

    问题描述 已知一个n n的矩阵 方阵n lt 100 把矩阵主副对角线上的元素值加上x 然后输出这个新矩阵 输入格式 一行两个变量 用空格隔开 代表n和x 接下来的n行每行n列 表示矩阵的数值 用空格隔开 输出格式 输出新矩阵 每个数字5个
  • 数据结构——排序

    前言 哈喽小伙伴们好久不见 也是顺利的考完试迎来了寒假 众所周知 不怕同学是学霸 就怕学霸放寒假 假期身为弯道超车的最佳时间 我们定然是不能懒散的度过 今天我们就一起来学习数据结构初阶的终章 七大排序 本文所有的排序演示都为升序排序 目录
  • 基于卡尔曼的混合预编码技术用于多用户毫米波大规模MIMO系统研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 「优选算法刷题」:移动零

    嗨 这个假期罗根开始接触了算法 在为今年的蓝桥杯做准备 所以 开个新专栏 记录记录自己做算法题时的心得 一 题目 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下
  • 【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 有 无策略奖励 2 2 训练结果1
  • 『力扣刷题本』:逆波兰表达式求值

    大家好久不昂 最近 1 个多月罗根一直在备考期末 文章发的很少 现在已经放寒假啦 学习自然也不能拉下 毕竟 4 月份就要去参加蓝桥杯了 先给自己定个小目标 日更 2 篇 咳咳 下面马上开始讲题 一 题目 给你一个字符串数组 tokens 表
  • 【GRNN-RBFNN-ILC算法】【轨迹跟踪】基于神经网络的迭代学习控制用于未知SISO非线性系统的轨迹跟踪(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 第1部分 2 2 第2部分

随机推荐

  • python的动态加载的一个注意地方

    先描述一下我的问题背景 然后给出错误发现 最终给出解决办法 1 我有很多python文件 并且这些文件内容会按照一定周期被更新但是文件名字不变 并且每个文件内都有一个一样的class的名字 需要我去动态调用 我的调用方法是使用的python
  • Spring-03 Aop简介,实现原理,基于ProxyFactoryBean实现Aop,基于AspectJ开发的实现

    Spring 03 1 SpringAop简介 AOP的全称是Aspect Oriented Programming 即面向切面编程 也称面向方面编程 它是面向对象编程 OOP 的一种补充 目前已成为一种比较成熟的编程方式 aop 解决的问
  • C语言——白盒测试

    深入理解白盒测试的基本方法 运用基本路径测试法设计测试用例 1 掌握白盒测试技术中基本路径测试法的基本步骤 2 训练针对具体程序运用基本路径测试法设计测试用例的能力 测试代码 DEVcpp 源代码 点击此处可下载 include
  • Android 自动化触发GC

    问题 最近有个小需求 能通过自动化对app进行GC回收 对于app的处理无外乎主动调用System gc 或者使用adb命令直接进行GC回收 解决方法 方法一 在代码里的某个方法调用System gc 如我申明一个receiver 然后通过
  • linux:SecureCRT SSH连接报错 Key exchange failed. No compatible key exchange method

    问题 配置ssh后提示 Key exchange failed No compatible key exchange method The server supports these methods curve25519 sha256 cu
  • 数据分析36计(九):倾向得分匹配法(PSM)量化评估效果分析

    1 因果推断介绍 如今量化策略实施的效果评估变得越来越重要 数据驱动产品和运营 业务等各方的理念越来越受到重视 如今这方面流行的方法除了实验方法AB testing外 就是因果推断中的各种观察研究方法 统计相关性并不意味着因果关系 数据分析
  • 高性能Mysql——一条SQL语句在Mysql中是如何执行的?

    文章目录 MySQL 基本架构概览 Server层介绍 SQL执行过程 查询语句 更新语句 SQL执行过程的日志问题 本篇文章会分析下一个 sql 语句在 MySQL 中的执行流程 包括 sql 的查询在 MySQL 内部会怎么流转 sql
  • Topaz Video AI for Mac 3.3.3

    Topaz Video AI是一款使用人工智能技术对视频进行增强和修复的软件 它可以自动降噪 去除锐化 减少压缩失真 提高清晰度等等 Topaz Video AI可以处理各种类型的视频 包括低分辨率视频 老旧影片 手机录制的视频等等 使用T
  • Java线程池源码解析及使用

    1 线程池的用处 Java 引入 Excutor 框架将任务的提交和执行进行解耦 只需要定义好任务 然后提交给线程池即可 使用线程池的时机 单个任务处理时间比较短 需要处理的任务数量很大 线程池的优点 降低资源消耗 通过重复利用已创建的线程
  • 【Java 基础】Java Validation API分组,顺序校验,以及自定以校验注解的优雅写法

    前言 我们后端需要对前端或者其它地方传过来的参数需要进行校验 其中JSR303定义了一些标准 接下来我们看看是如何实现分组校验和顺序校验的 前置工作 如下是一个基础测试实体类 和一个测试controller Data public clas
  • Servlet+JDBC实战开发书店项目讲解第六篇:订单实现

    Servlet JDBC实战开发书店项目讲解第六篇 订单实现 1 数据库设计 在订单实现之前 我们需要对数据库进行相应的设计 在这个书店项目中 我们可以创建以下两个表来实现订单功能 1 1 订单表 Order 订单ID order id 主
  • 剪映电脑版使用教程(超详细)

    目录 页面设置 流程 素材详解 1 导入素材 2 注意导入素材的格式 3 添加素材到时间线面板 4 素材的删除 5 素材的分割 6 素材的伸缩 时间线面板详解 1 多条轨道的重叠 2 多条轨道的素材导入 3 多条轨道的分割 4 定格功能 5
  • Echarts折线图属性设置大全

    Echarts折线图属性设置大全 var option backgroundColor FFF0F5 title text 折线图 subtext 模拟数据 x center legend orient 设置布局方式 默认水平布局 可选值
  • html页面使用vue组件,初始化高德地图(实现绘制折线)

    html页面使用vue组件 初始化高德地图 实现绘制折线 一 vue初始化地图 1 引入高德地图的js 2 初始化地图容器
  • scroll-view 安卓无法下拉

    当前 Bug 的表现 在安卓上对 scroll view 无法下拉而且无法触发下拉事件 预期表现 与ios表现一致 可以使用scroll view 进行下拉并且触发下拉事件 原因 在ios上是可以下拉出来一部分距离从而触发下拉事件 但是在安
  • 攻防世界-WEB:command_execution

    题目https adworld xctf org cn challenges problem set index id 25 题目描述 小宁写了个ping功能 但没有写waf X老师告诉她这是非常危险的 你知道为什么吗 根据题目描述 我们可
  • 查找问题的利器 - Git Blame

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 造福人民 实现我们中华民族伟大复兴 原文 http gitbook liuhui998 c
  • 算法-倒置排序

    include
  • k8s学习-思维导图与学习笔记

    目录 前言 k8s思维导图 推荐 书籍 网站 课程 了解与安装 基础 资源调度 服务发布 配置管理 进阶 持久化存储 高级调度 高级 RBAC NetworkPolicy CKA 安全 CKS 前言 博主准备学习k8s 考个CKA和CKS证
  • 利用栈来破解迷宫问题

    利用栈来破解迷宫问题 对于迷宫类问题的破解 需要利用栈的思想 1 构思 假设 当前位置 指的是在搜索过程中某一时刻所在途中某个方块的位置 路径是最优走法 则求迷宫当中一条路径的思想便是 若当前位置可以通过 那么存放在 路径 中 可以通过的位