手写一个链栈(算法村第四关青铜挑战)

 本链栈用于解决迷宫问题之寻找所有路径

/*** 存储路径坐标的结点,称为路径结点* 因为数量无法确定,故使用链式结构*/
typedef struct Node
{int coordinate; //坐标struct Node* next;
}Node;typedef Node* PNode;    //路径结点的指针类型
typedef Node* LinkStack;    //链栈指针,可代表栈顶指针/*** 创建一个链栈,并返回栈顶指针*/
LinkStack creatLinkStack()
{LinkStack top = (LinkStack)malloc(sizeof(Node));if(top != NULL)top->next = NULL;elseprintf("链栈创建失败");return top;
}/*** @param top 坐标要入的栈的栈顶指针* @param coordinate 入栈坐标*/
void push(LinkStack top, int coordinate)
{PNode pNode = (PNode)malloc(sizeof(Node));if(pNode == NULL)printf("入栈失败");else{pNode->coordinate = coordinate;//头插法pNode->next = top->next;top->next = pNode;}
}/*** 空栈返回1,非空返回0*/
int isEmpty(LinkStack top)
{return top->next==NULL ? 1 : 0;
}/*** 弹出栈顶元素的坐标*/
int pop(LinkStack top)
{int coordinate;coordinate = top->next->coordinate; //获取栈顶元素的坐标//删除栈顶元素,更新栈顶指针PNode t = top->next;top->next = t->next;free(t);return coordinate;
}

全部代码

// Created by Mr.Chen on 2023/12/25.#include<stdio.h>
#include<stdlib.h>/*** 9*9迷宫(最外围是一堵墙)* 1代表墙,0代表空格* 只有东西南北4个方向可以走*/
#define SIZE 9   //迷宫大小
int maze[SIZE][SIZE];   //迷宫/*** 存储路径坐标的结点,称为路径结点* 因为数量无法确定,故使用链式结构*/
typedef struct Node
{int coordinate; //坐标struct Node* next;
}Node;typedef Node* PNode;    //路径结点的指针类型
typedef Node* LinkStack;    //链栈指针,可代表栈顶指针/*** 创建一个链栈,并返回栈顶指针*/
LinkStack creatLinkStack()
{LinkStack top = (LinkStack)malloc(sizeof(Node));if(top != NULL)top->next = NULL;elseprintf("链栈创建失败");return top;
}/*** @param top 坐标要入的栈的栈顶指针* @param coordinate 入栈坐标*/
void push(LinkStack top, int coordinate)
{PNode pNode = (PNode)malloc(sizeof(Node));if(pNode == NULL)printf("入栈失败");else{pNode->coordinate = coordinate;//头插法pNode->next = top->next;top->next = pNode;}
}/*** 空栈返回1,非空返回0*/
int isEmpty(LinkStack top)
{return top->next==NULL ? 1 : 0;
}/*** 弹出栈顶元素的坐标*/
int pop(LinkStack top)
{int coordinate;coordinate = top->next->coordinate; //获取栈顶元素的坐标//删除栈顶元素,更新栈顶指针PNode t = top->next;top->next = t->next;free(t);return coordinate;
}/*** 从文件中读取迷宫*/
void fileRead()
{FILE* fp;/* 打开用于读取的文件,路径不能有中文 */fp = fopen("D:\\Projects\\ClionProjects\\mazeText\\1.txt", "r");if(fp == NULL){perror("打开文件时发生错误");return;}for(int i=0; i < SIZE; i++){for(int j = 0;j < SIZE;j++)fscanf(fp,"%d",&maze[i][j]);/*每次读取一个数,fscanf函数遇到空格或者换行结束*/fscanf(fp,"\n");}fclose(fp);
}/*** 打印迷宫*/
void printfMaze()
{printf("迷宫:■(墙)  .(路)  ♧(入口)  ♤(出口)\n");printf("    ");for(int i = 0; i < SIZE; i++)printf("%d   ",i);printf("\n");for(int i = 0; i < SIZE; i++){//可视化路径printf("%d   ",i);for(int j = 0; j < SIZE; j++){//打印入口if(i == 1 && j == 1)printf("♧   ");//打印出口else if(i == SIZE - 2 && j == SIZE - 2)printf("♤   ");//打印墙else if(maze[i][j] == 1)printf("■   ");//打印路else{/*if(path[i][j] == 1)printf("√   ");else*/printf(".   ");}}printf("\n");}}/*** 递归+深度优先搜索打印所有路径* @param entryX 入口行坐标* @param entryY 入口列坐标* @param exitX 出口行坐标* @param exitY 出口列坐标* @param maze 迷宫* @param path 路径栈,path也可以用作栈顶指针* @param visited 访问标记数组*/
void mazeDFS(int entryX, int entryY, int exitX, int exitY, LinkStack path, int visited[SIZE][SIZE])
{//递归的返回条件:到达终点。每返回一次打印一条路径if (entryX == exitX && entryY == exitY){//打印出口printf("(%d,%d)", exitX, exitY);PNode p = path->next;while (p != NULL){//将栈中的元素解码,得到路径上的坐标printf(" <- (%d,%d)", p->coordinate / SIZE, p->coordinate % SIZE);p = p->next;}printf("\n");   //换行,打印下一条路径printf("\n");return;}int direction[4][2]={{0,1},{1,0},{0,-1},{-1,0}};for (int mov = 0; mov < 4; mov++){//此次探访的坐标int nextX = entryX + direction[mov][0];int nextY = entryY + direction[mov][1];//探访位置是空格且尚未访问if (maze[nextX][nextY] == 0 && visited[nextX][nextY] == 0){//将本次起点的坐标编码后压入路径栈,并将其标记为已访问push(path,entryX * SIZE + entryY);visited[entryX][entryY] = 1;//递归mazeDFS(nextX, nextY, exitX, exitY, path, visited);//每次搜索结束后都将上一个坐标标记为尚未未访问,这是为了换下一个方向继续探索visited[entryX][entryY] = 0;//在路径中删除该坐标pop(path);}}}int main()
{//从文件中读取迷宫fileRead();//将入口设置在左上角,出口设置在右下脚int entryX = 1;int entryY = 1;int exitX = 7;int exitY = 7;//打印迷宫结构printfMaze();//创建路径栈LinkStack path = creatLinkStack();//访问标记数组。不能在递归中初始化int visited[SIZE][SIZE] = {0};//递归+深搜,打印所有路径printf("所有路径如下:\n");mazeDFS(entryX,entryY,exitX,exitY,path,visited);return 0;
}

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

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

相关文章

Spring Boot核心特性、注解和Bean作用域

Spring Boot 是基于 Spring Framework 构建应用程序的框架&#xff0c;Spring Framework 是一个广泛使用的用于构建基于 Java 的企业应用程序的开源框架。Spring Boot 旨在使创建独立的、生产级别的 Spring 应用程序变得容易&#xff0c;您可以"只是运行"这些应用程序…

编程笔记 html5cssjs 016 HTML表格

编程笔记 html5&css&js 016 HTML表格 一、HTML 表格二、HTML 表格标签三、边框属性四、单元格合并小结 表格是一种常用的文档格式。学习或办公过程中也常常使用表格。有专用的电子表格软件&#xff0c;如EXCEL、WPS表格等。表格也经常与文字混合在文章中使用。网页中也…

openssl 命令详解

openssl genrsa 命令产生私钥 openssl genrsa 命令是会用来生成 RSA 私有秘钥&#xff0c;不会生成公钥&#xff0c;因为公钥提取自私钥。生成时是可以指定私钥长度和密码保护。 如果需要查看公钥或生成公钥&#xff0c;可以使用 openssl rsa 命令。 命令语法&#xff1a; ope…

Python学习笔记(四)流程控制方法

流程控制有三种方法&#xff1a;分支、循环、跳出 流程的控制通过布尔值来实现&#xff0c;分支和循环都需要对一定的条件进行判断&#xff0c;根据判断结果&#xff08;布尔值&#xff09;决定下一步要做什么 布尔值通过比较运算符、逻辑运算符来进行判断是True还是False 不…

Vue3全局属性app.config.globalProperties

文章目录 一、概念二、实践2.1、定义2.2、使用 三、最后 一、概念 一个用于注册能够被应用内所有组件实例访问到的全局属性的对象。点击【前往】访问官网 二、实践 2.1、定义 在main.ts文件中设置app.config.globalPropertie import {createApp} from vue import ElementPl…

python中使用socket服务发送接收图像

python中使用socket服务发送接收图像的代码&#xff0c;可在服务器端中插入模型推理代码进行推理返回结果。 服务器端 # -*-coding:utf-8-*- import os.path import socket import structdef deal_image(sock, addr):print(connection, addr)while True:# 计算文件信息大小fil…

会声会影2023渲染闪退怎么办

​ 会声会影2023是一款功能强大&#xff0c;操作简单的视频剪辑软件。在使用会声会影剪辑视频后&#xff0c;我们要对视频进行渲染&#xff0c;有时会出现渲染到一半闪退&#xff0c;或是帧不可读的问题&#xff0c;那么遇到这些情况我们该怎么办呢&#xff1f;下面将为大家介绍…

基于Django/springboot的个性化电影推荐系统设计与实现-协同过滤技术

项目设计目的&#xff1a; 本项目旨在开发一个基于Django框架的协同过滤电影推荐系统&#xff0c;通过分析用户的历史行为和喜好&#xff0c;为用户提供个性化的电影推荐。通过该系统&#xff0c;用户可以发现新的电影作品&#xff0c;提高用户对电影的满意度和粘性。 功能需求…

ssm基于冲突动态监测算法的健身房预约系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装健身房预约系统软件来发挥其高效地信息处理的作用&#xff…

攻防世界easyphp解题

攻防世界easyphp解题 <?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die(&q…

PAT 乙级 1043 输出PATest

解题思路&#xff1a;对于c来说hash函数求出各个符号的数量&#xff0c;不为0时就输出即可&#xff0c;python利用字符串count函数就可以了。 c语言代码如下: #include<stdio.h> int output_c(char c,int *count) {if(*count!0){putchar(c);(*count)--;}return 1; } int…

Jenkins基础教程

目录 第一章、快速了解Jenkins1.1&#xff09;Jenkins中一些概念介绍1.2&#xff09;Jenkins和maven用途上的区别1.3&#xff09;为什么使用Jenkins1.4&#xff09;学习过程中的疑问 第二章、安装Jenkins2.1&#xff09;安装之前的准备2.2&#xff09;Windows中Jenkins下载安装…

出版实务 | 校对

文章目录 校对校对工作校异同与校是非校样的方式和种类毛校样初校样二校样三校样付印样付印清样 校对人员 校对的方法对校法读校本校法他校法理校法 校对的工序毛校初校二校三校通读核红誊样文字技术整理对片 校对的制度 校对 校对工作 校对工作是文字性、知识性的创造性劳动…

面向对象(类和对象,对象内存图,成员变量和局部变量,封装,构造方法)

1. 类和对象 1.1 类和对象的理解 客观存在的事物皆为对象 &#xff0c;所以我们也常常说万物皆对象。 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象类是对象的数据类型&#xff0c;类是具有相同属性和行为的一组对象的集合简单理解&#xff1a;类就是对…

2走近chatGPT 走向AGI 机器学习 chatGPT研发过程主要步骤 收到一个问题后的处理步骤

目标&#xff1a;走向AGI 我们不想写代码了&#xff0c;想让机器能自己&#xff08;输入&#xff09;听到、看到、摸到、闻到、理解并&#xff08;输出&#xff09;做到、说出来、画出来、表现出来&#xff0c;适应新东西完成复杂的任务不再需要人类干预&#xff0c;这就是AGI…

计算机网络(1)

计算机网络&#xff08;1&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 计算机网络和因特网&#xff08;1&#xff09;因特网概念解读服务常见的服务 协议网络边缘特点强调 网络核心特点强调 小程一言 我的计算机网络专栏&#xff0c;是自己在计算机网络…

Python模拟技巧实现自动抽屉登录和自动点赞

目录 一、引言 二、准备工作 三、自动抽屉登录 四、自动点赞 五、注意事项 六、案例分析 七、总结 一、引言 随着互联网的普及&#xff0c;人们越来越依赖于各种在线平台进行社交互动和信息获取。在这些平台上&#xff0c;用户需要登录才能享受各种服务&#xff0c;同时…

【DevOps】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境&#xff08;以php7.0为例 &#xff09;3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…

Halcon底帽运算bottom_hat

Halcon底帽运算 底帽运算的原理是用原始的二值图像减去闭运算的图像。闭运算的目的是对某些局部区域进行“填补”&#xff0c;如填空洞、使分离的边缘相连接等。而底帽运算正是用来提取这些用于填补的区域的。图&#xff08;a&#xff09;为从二值图像中提取出的亮的区域&…

解决 Nginx 反向代理中的 DNS 解析问题:从挑战到突破20231228

引言 在使用 Nginx 作为反向代理服务器时&#xff0c;我们可能会遇到各种配置和网络问题。最近&#xff0c;我遇到了一个有趣的挑战&#xff1a;Nginx 在反向代理配置中无法解析特定的域名&#xff0c;导致 502 错误。这个问题的解决过程不仅揭示了 Nginx 的一个不太为人知的功…