数据结构-迷宫问题

文章目录

    • 1、题目描述
    • 2、题目分析
    • 3、代码实现


1、题目描述

题目链接:迷宫问题
在这里插入图片描述
在这里插入图片描述
注意不能斜着走!

2、题目分析

(1)0为可以走,1不能走且只有唯一一条通路
(2)我们可以通过判断上下左右来确定路是否能通过,再设置如果走过的路就用 2 来标记,这样就不会走回头路了,如果有多条能通过,只选择一条路来走
(3)当我们遇到死胡同时,应该返回到上一个位置,再重新判断其他路是否可以走,没有就继续往回退,直到找到下一条路来,像这样的我们就要用到递归了。
(4)因为坐标是2个数据所以我们创建一个结构体来记录坐标。
(5)我们在一进到函数就先保存坐标,再找其他的路,如果没有找到就说明这是一条死胡同,我们就要往后退,再这个过程我们还需要将进来保存的坐标给拿出来,这种后进先出的的数据结构是栈,所以我们要借助栈来实现,不懂栈的可以看看哦:栈
(6)因为栈是先进后出的,所以这跟题目要求不符合,所以我们要再创建一个栈,将另一个栈的数据倒到新的栈里,再输出就符合题目要求了
(7)注意:输出的格式、在结尾还要释放栈和创建的数组、题目可能要求多组测试用例

3、代码实现

#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
//定义结构体,标记坐标
typedef struct Postion {int row;//行int col;//列
} PT;
///
//栈
typedef PT STDataType;//结构体类型
typedef struct Stack {STDataType* a;int top;//元素个数int capacity;//空间大小
} ST;void StackInit(ST* ps);
void StackDestory(ST* ps);
// 入栈
void StackPush(ST* ps, STDataType x);
// 出栈
void StackPop(ST* ps);
STDataType StackTop(ST* ps);int StackSize(ST* ps);
bool StackEmpty(ST* ps);void StackInit(ST* ps) {assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);if (ps->a == NULL) {printf("malloc fail\n");exit(-1);}ps->capacity = 4;ps->top = 0;
}void StackDestory(ST* ps) {assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}// 入栈
void StackPush(ST* ps, STDataType x) {assert(ps);// 满了-》增容if (ps->top == ps->capacity) {STDataType* tmp = (STDataType*)realloc(ps->a,ps->capacity * 2 * sizeof(STDataType));if (tmp == NULL) {printf("realloc fail\n");exit(-1);}else {ps->a = tmp;ps->capacity *= 2;}}ps->a[ps->top] = x;ps->top++;
}// 出栈
void StackPop(ST* ps) {assert(ps);// 栈空了,调用Pop,直接中止程序报错assert(ps->top > 0);//ps->a[ps->top - 1] = 0;ps->top--;
}STDataType StackTop(ST* ps) {assert(ps);// 栈空了,调用Top,直接中止程序报错assert(ps->top > 0);return ps->a[ps->top - 1];
}int StackSize(ST* ps) {assert(ps);return ps->top;
}bool StackEmpty(ST* ps) {assert(ps);return ps->top == 0;
}///
ST Pata;//栈
//判断是否有路
bool IsPass(int** maze, int N, int M, PT pos) {//(1)判断是否越界//(2)判断坐标是否为0if (pos.row >= 0 && pos.row < N&& pos.col >= 0 && pos.col < M&& maze[pos.row][pos.col] == 0) {return true;}else {return false;}}//打印
void PrintPatar(ST*pata) {//再设置一个栈ST patar;StackInit(&patar);//将pata这个栈倒到patar栈里while (!StackEmpty(pata)) {StackPush(&patar, StackTop(pata));StackPop(pata);}while (!StackEmpty(&patar)) {PT top = StackTop(&patar);printf("(%d,%d)\n", top.row, top.col);//按照题目的要求打印StackPop(&patar);}//释放StackDestory(&patar);
}bool GetMazePath(int** maze, int N, int M, PT cur) {//先入栈StackPush(&Pata, cur);//改变当前位置maze[cur.row][cur.col] = 2;//判断是否到出口if (cur.row == N - 1 && cur.col == M - 1)return true;//接下来我们分上下左右判断是否有路可走//上//记录上的位置PT next = cur;next.row -= 1;if (IsPass(maze, N, M, next)) {//有就进行递归if (GetMazePath(maze, N, M, next))//真的有路就返回真即可return true;}//下//记录下的位置next = cur;next.row += 1;if (IsPass(maze, N, M, next)) {if (GetMazePath(maze, N, M, next))return true;}//左//记录左的位置next = cur;next.col -= 1;if (IsPass(maze, N, M, next)) {if (GetMazePath(maze, N, M, next))return true;}//右//记录右的位置next = cur;next.col += 1;if (IsPass(maze, N, M, next)) {if (GetMazePath(maze, N, M, next))return true;}StackPop(&Pata);//走到没路了就返回假return false;
}int main() {int N = 0, M = 0;//行和列的大小while (scanf("%d%d", &N, &M) != EOF) {//可能会有多组测试用例//内存函数造一个二维数组int** maze = (int**)malloc(sizeof(int*) * N);for (int i = 0; i < N; i++)maze[i] = (int*)malloc(sizeof(int) * M);//输入迷宫,0代表可过,1代表不通for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {scanf("%d", &maze[i][j]);}}//初始化,入口PT S = { 0, 0 };//初始化栈StackInit(&Pata);//实行GetMazePath(maze, N, M, S);//打印PrintPatar(&Pata);//释放栈StackDestory(&Pata);//释放空间for (int i = 0; i < N; i++)free(maze[i]);free(maze);maze = NULL;}return 0;
}

递归过程:
假设迷宫:

在这里插入图片描述
在这里插入图片描述
这就是走整个迷宫的流程

以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!

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

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

相关文章

vue 在for循环中设置ref并获取$refs

一、单循环动态设置ref 1.设置&#xff1a;【:ref“‘XXX’ index”】XXX -->自定义ref的名字 2.获取&#xff1a;let ref eval(‘this.$refs.XXX’ index)[0] 3.示例&#xff1a; 代码如下所示 <template><div class"ref_test"><div v-fo…

两线制(V/F,I/F)频率脉冲信号转换器

两线制(V/F,I/F)频率脉冲信号转换器 型号&#xff1a;JSD TAF-1021S V/F,I/F频率脉冲信号转换器 型号&#xff1a;JSD TAF-1001S 高端型 型号&#xff1a;JSD TAF-1001D 经济型&#xff0c;价格优惠 新款V/F,I/F频率脉冲信号转换器属升级款&#xff0c;产品从性能&#xf…

邮政快递查询,邮政快递单号查询,根据更新量筛选出需要的单号

批量查询邮政快递单号的物流信息&#xff0c;并根据物流更新量将需要的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…

指针相关知识(进阶)

前面的入门中已经介绍了指针的基础知识&#xff0c;接下来&#xff0c;让我们继续学习吧&#xff01; 一. 字符指针变量 char* 一般形式 int main() {char n w;char* pa &n;*pa w;return 0; } 这并不是把字符串hello world放在n中&#xff0c;而是把第一个字符的地址…

开辟“护眼绿洲”,荣耀何以为师?

文 | 智能相对论 作者 | 佘凯文 俗话说&#xff0c;眼睛是心灵的窗户&#xff0c;可如今&#xff0c;人们对于这扇“窗户”的保护&#xff0c;似乎越来越不重视。 据人民日报今年发布的调查显示&#xff0c;中国眼病患病人数2.1亿&#xff0c;近视患者人数多达6亿&#xff0…

干货分享|数据驱动消费者价值提升实践

数据如何驱动消费者价值提升&#xff1f;围绕该话题&#xff0c;神策数据品牌零售事业部总经理刘洋从运营挑战、价值主张、解决方案三个方面做了完整分享。 一、数据化运营面临的挑战 1、数据与全域业务打通。品牌数据量庞大&#xff0c;种类较多&#xff0c;独立存在&#xff…

C++使用UDP

C使用UDP 对C使用UDP做了简单封装&#xff0c;可直接运行 头文件udp.h #pragma once #include <Winsock.h> #pragma comment(lib,"WS2_32.lib")#define LOCAL_IP_ADDR INADDR_ANY //当前应用程序接收的IP地址 #define LOCAL_PORT 9527 …

上手第一关,手把手教你安装kafka与可视化工具kafka-eagle

上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle 一、环境与下载二、安装三、启动1. 启动ZK2. 启动Kafka 四、可视化工具 EFAK(kafka-eagle)1. kafka开启JMX2. 下载及配置3. 启动故障及解决① 错误信息 C:\Program is not recognized as an internal or ext…

灾备建设中,虚拟机异构平台恢复技术原理与应用

在如今混合云环境下&#xff0c;实现异构虚拟化恢复与迁移面临着极大挑战。不同于市面上有代理的恢复方案&#xff0c;虚拟机无代理跨平台恢复解决方案利用自主研发的转换引擎&#xff08;VMCE&#xff09;对已备份虚拟机文件进行高效的存储格式转换和配置信息转换&#xff0c;…

运营微信视频号要注意哪些问题?

视频号运营的5个雷点你别踩! 今天和你说的视频号运营的5大雷点 你踩过没? 这5点虽然和野花似的 但也不能踩哦 雷点1:违规行为 雷点2:抄袭剽窃 雷点3:没有明确目标受众 雷点4:短视频质量过低 雷点5:缺少社交互动 相信不管是视频号还是别的平台都通用哈

docker consul容器自动与注册

微服务&#xff08;容器&#xff09;注册与发现&#xff1a;是一种分布式的管理系统&#xff0c;定位服务的方法。 在传统架构当中&#xff0c;应用程序之间直连到已知服务&#xff0c;设备提供的网络&#xff1a;IP地址&#xff0c;基于tcp/ip&#xff0c;端口&#x…

flume:Ncat: Connection refused.

一&#xff1a;nc -lk 44444 和 nc localhost 44444区别 nc -lk 44444 和 nc localhost 44444 是使用 nc 命令进行网络通信时的两种不同方式。 1. nc -lk 44444&#xff1a; - 这个命令表示在本地监听指定端口&#xff08;44444&#xff09;并接受传入的连接。 - -l 选项…

Google 论坛和 QA 结构化数据更新重点关注 Authorship

谷歌更新了论坛结构化数据和问答结构化数据的文档&#xff0c;明确了这两种结构化数据与作者身份相关的新要求。 就论坛结构化数据而言&#xff0c;对 InteractionCounter schema.org 数据类型进行了说明&#xff0c;还为作者类型增加了一个新的推荐属性&#xff0c;这两个属性…

AutoSAR(基础入门篇)1.3-AutoSAR的概述

目录 一、到底什么是AutoSAR 1、大白话来讲 2、架构上来讲 应用软件层(APPL) 实时运行环境&#xff08;RTE&#xff09; 基础软件层(BSW) 3、工具链上来讲 二、AutoSAR的目标 一、到底什么是AutoSAR 1、大白话来讲 AUTOSAR 就是AUTomotive Open System ARchitecture的…

nginx 1.24.0 安装nginx最新稳定版

1.官网&#xff1a; nginx: download 2. 选择稳定版&#xff1a; 3. 可以下载&#xff0c;然后上传服务器&#xff0c;也可以wget获取&#xff1a; cd /home wget https://nginx.p2hp.com/download/nginx-1.24.0.tar.gz 4. 放入/home 下。并解压缩&#xff0c;重命名nginx;…

【教学类-06-18】20231216 (按“列”正序题)X-Y之间“加法题+题”(1页最多0-13。不考虑空格补全)

作品展示&#xff1a;按列排序&#xff0c;从小到大正序&#xff08;有空格&#xff09; 背景需求&#xff1a; 55格模板&#xff0c;很多幼儿都是按照“列”的方式&#xff0c;从上到下&#xff0c;从左向右完成题目的。 视觉上&#xff0c;两列之间间距大&#xff08;给孩子…

美团赚钱更难了,Q3核心业务利润率下降2%,市值一年缩水近6000亿

从“买菜”卷向“超市”&#xff0c;成立5年的美团买菜更名为“小象超市”。 就在更名公告发布的前一天&#xff0c;美团公布了2023年三季报&#xff0c;尽管三季度营收净利双增长&#xff0c;但其股价却呈相反趋势。 三季报发布次日(11月29日)&#xff0c;美团港股股价单日跌…

MIT6.5840-2023-Lab2C: Raft-Persistence

前置知识 见上一篇 Lab2A。 实验内容 实现 RAFT&#xff0c;分为四个 part&#xff1a;leader election、log、persistence、log compaction。 实验环境 OS&#xff1a;WSL-Ubuntu-18.04 golang&#xff1a;go1.17.6 linux/amd64 Part 2C: persistence 大部分的bug都与这…

八、Seata的XA模式

目录 八、Seata的XA模式8.3 XA模式多数据源场景1 环境搭建2、使⽤XA模式解决事务 八、Seata的XA模式 8.3 XA模式多数据源场景 1 环境搭建 建库建表 代码的db.sql中 创建工程 添加依赖 <dependency><groupId>org.springframework.boot</groupId><ar…

VBA技术资料MF96:单字段多条件高级筛选

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…