第 3 章 栈和队列(用递归函数求解迷宫问题(求出所有解))

news2024/10/7 10:15:45

 1. 背景说明:

若迷宫 maze 中存在从入口 start 到出口 end 的通道,则求出所有合理解并求出最优解

迷宫示意图:

输入文本:

10 10

18

1 3
1 7
2 3
2 7
3 5
3 6
4 2
4 3
4 4
5 4
6 2
6 6
7 2
7 3
7 4
7 6
7 7
8 1

1 1

8 8

2. 示例代码:

mazeProblem.h

/* 用递归函数求解迷宫问题(求出所有解)头文件 */

#ifndef MAZEPROBLEM_H
#define MAZEPROBLEM_H

#define MAXLENGTH 25			/* 设迷宫最大行列为 25 */

/* 定义墙元素值为 0,可通过路径为 -2, 不能通过路径为 -1 */
typedef int MazeType[MAXLENGTH][MAXLENGTH];

/* 迷宫位置坐标 */
typedef struct {
	int x;
	int y;
} MazePosition;

typedef struct {
	int high;
	int length;
	int minStep;
	int solveNum;
} MazeInfo;

/* 如果存在路径,输出求得的迷宫的解 */
void PrintMazePath(int row, int col, const MazeType* maze);

/* 求出迷宫 maze 中存在从入口 start 到出口 end 的所有可行通道 */
void MazePath(const MazePosition* curPos, const MazePosition* end, MazeInfo* mazeInfo,
	int curStep, MazeType* maze);

#endif

mazeProblem.c

/* 用递归函数求解迷宫问题(求出所有解)源文件 */

#include "mazeProblem.h"
#include <stdio.h>
#include <windows.h>

/* 设置字体颜色,入参为 0 - 15 */
static void SetColor(const unsigned short textColor)
{
	if ((textColor >= 0) && (textColor <= 15)) {
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), textColor);
	} else {
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
	}
}

/* 如果存在路径,输出求得的迷宫的解 */
void PrintMazePath(int row, int col, const MazeType* maze)
{
	for (int i = 0; i < row; ++i) {
		for (int j = 0; j < col; ++j) {
			if ((*maze)[i][j] > 0) {
				SetColor(2);
				printf("%3d", (*maze)[i][j]);
			} else {
				SetColor(7);
				printf("%3d", (*maze)[i][j]);
			}

		}

		printf("\n");
	}
}

/* 求出迷宫 maze 中存在从入口 start 到出口 end 的所有可行通道 */
void MazePath(const MazePosition* curPos, const MazePosition* end, MazeInfo* mazeInfo,
	int curStep, MazeType* maze)
{
	MazePosition nextPos = { 0 };
	/* 上下左右四个方向的行、列增量 */
	MazePosition direc[4] = { { -1, 0 }, { 1 , 0 }, { 0, -1 }, { 0, 1 } };
	for (int i = 0; i <= 3; ++i) {
		nextPos.x = curPos->x + direc[i].x;
		nextPos.y = curPos->y + direc[i].y;
		if ((*maze)[nextPos.x][nextPos.y] == -2) {
			(*maze)[nextPos.x][nextPos.y] = ++curStep;
			if ((nextPos.x != end->x) || (nextPos.y != end->y)) {
				MazePath(&nextPos, end, mazeInfo, curStep, maze);
			} else {
				mazeInfo->minStep = (mazeInfo->minStep > curStep) ? curStep : mazeInfo->minStep;
				++(mazeInfo->solveNum);
				printf("Use %d steps\n\n", curStep);
				PrintMazePath(mazeInfo->high, mazeInfo->length, maze);
				printf("\n\n");
			}

			(*maze)[nextPos.x][nextPos.y] = -2;
			--curStep;
		}
	}
}

main.c

/* 入口程序源文件 */

#include "mazeProblem.h"
#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf("Please input the row and col of the maze: ");
	int row = 0, col = 0;
	scanf_s("%d%d", &row, &col);
	MazeInfo mazeInfo = { row, col, INT_MAX, 0 };
	MazeType maze = { 0 };
	for (int i = 0; i < col; ++i) {
		maze[0][i] = 0;
		maze[row - 1][i] = 0;
	}

	for (int i = 1; i < row - 1; ++i) {
		maze[i][0] = 0;
		maze[i][row - 1] = 0;
	}

	for (int i = 1; i < row - 1; ++i) {
		for (int j = 1; j < col - 1; ++j) {
			maze[i][j] = -2;
		}
	}

	printf("Please input the num of the wall: ");
	int wallNum = 0;
	scanf_s("%d", &wallNum);
	printf("Please input the position of the wall(x, y): \n");
	int x = 0, y = 0;
	for (int i = 0; i < wallNum; ++i) {
		scanf_s("%d%d", &x, &y);
		maze[x][y] = 0;
	}

	printf("The structure of the maze is:\n");
	PrintMazePath(row, col, &maze);
	MazePosition start = { 0 }, end = { 0 };
	printf("Please input the position of the start point(x, y):");
	scanf_s("%d%d", &start.x, &start.y);
	maze[start.x][start.y] = 1;
	printf("Please input the position of the end point(x, y):");
	scanf_s("%d%d", &end.x, &end.y);
	MazePath(&start, &end, &mazeInfo, 1, &maze);
	printf("Min Steps: %d\n", mazeInfo.minStep);
	printf("Total solves: %d\n", mazeInfo.solveNum);

	return 0;
}

3. 输出示例:

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

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

相关文章

Ae 效果:CC Threads

生成/CC Threads Generate/CC Threads CC Threads&#xff08;CC 编织条&#xff09;效果基于当前图层像素生成编织条图案和纹理。可以用在各种设计中&#xff0c;如背景设计、图形设计、文字设计等。 ◆ ◆ ◆ 效果属性说明 Width 宽度 设置编织的宽度。 默认值为 50。值越大…

【计算机组成 课程笔记】3.1 算数运算和逻辑运算

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 1 - 301-算术运算和逻辑运算&#xff08;13-7--&#xff09;_哔哩哔哩_bilibili 计算机的核心功能就是运算&#xff0c;运算的基本类型包括算数运算和逻辑运算。想要了解计算机是如何实现运算的&#xff0c;我…

linux免密登录报错 Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf

问题&#xff1a;权限不对的 解决&#xff1a; 1.检查文件的所有者和权限。 确保文件的所有者是正确的。 运行以下命令来确定文件的所有者和权限&#xff1a; ls -l /etc/ssh/ssh_config.d/05-redhat.conf 通常情况下&#xff0c;SSH配置文件应该属于root用户。如果所有者不是…

HDLBits 练习 Always if2

Always if2 一个常见的错误&#xff1a;如何避免产生锁存器。 当设计一的电路的时候&#xff0c;你首先应该从电路的角度去思考。 我想要一个逻辑门我想要一个有着3和输入和3输出的组合逻辑电路。我想要一个后边跟着一个触发器的组合逻辑电路。 你必须不能先写代码&#xf…

VC++6.0下载安装使用教程

一、前言 微软原版的 VC6.0 已经不容易找到&#xff0c;网上提供的都是经过第三方修改的版本&#xff0c;删除了一些使用不到的功能&#xff0c;增强了兼容性。这里我们使用 VC6.0 完整绿色版&#xff0c;它能够支持一般的 C/C 应用程序开发以及计算机二级考试。 二、VC6.0 下…

设计模式大白话——适配器模式

适配器模式 概述示例适配器的种类小结 概述 ​ 适配器其实非常好理解&#xff0c;放到生活中来&#xff0c;我们身边处处都有这样的例子&#xff0c;最常见的是用的比较多的各种转接线&#xff08;如&#xff1a;USB 转 Type-C&#xff09;&#xff0c;有了这个“适配器”&…

基于 kube-vip 部署 kubernetes 高可用集群

kube-vip 简介 kube-vip 是一个开源项目&#xff0c;旨在简化为 Kubernetes 集群提供负载均衡服务。 kube-vip 为 Kubernetes 集群提供虚拟 IP 和负载均衡器&#xff0c;用于控制平面&#xff08;用于构建高可用集群&#xff09;和 Kubernetes 服务类型&#xff0c;而无需依赖…

智己 LS6 用实力和你卷,最强 800v ?

2023 成都车展期间&#xff0c;智己 LS6 正式公布预售价格&#xff0c;新车预售价为 23-30 万元。新车会在 10 月份进行上市&#xff0c;11 月正式交付。 此前我们对智己 LS6 做过非常详细的静态体验&#xff0c;感兴趣的可点击此链接了解。 造型方面&#xff0c;新车前脸相比…

CNN(六):ResNeXt-50实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 ResNeXt是有何凯明团队在2017年CVPR会议上提出来的新型图像分类网络。它是ResNet的升级版&#xff0c;在ResNet的基础上&#xff0c;引入了ca…

【C++】VS配置OpenCV/Libtorch环境

前言 本文是视频https://www.bilibili.com/video/BV1dp4y177L4的笔记。 OpenCV和Libtorch安装包&#xff1a;https://pan.baidu.com/s/1i3DqTcHFSC1rRDsIgYGCsQ?pwd8888 VS版本&#xff1a;2019 Opencv版本&#xff1a;3.4.1 Libtorch版本&#xff1a;2.0.1cu117 配置Open…

CUBLAS库入门教程(从环境配置讲起)

文章目录 前言一、搭建环境二、简单介绍三、 具体例子四、疑问 前言 CUBLAS库是NVIDIA CUDA用于线性代数计算的库。使用CUBLAS库的原因是我不想去直接写核函数。 &#xff08;当然&#xff0c;你还是得学习核函数该怎么写。但是人家写好的肯定比我自己写的更准确&#xff01;&…

利用MarkovJunior方法生成迷宫和图形的MATLAB演示[迷宫生成、贪吃蛇、地图生成、图案生成]

利用MarkovJunior方法生成迷宫和图形的MATLAB演示[迷宫生成、贪吃蛇、地图生成、图案生成] 0 前言1 介绍MarkovJunior2 迷宫生成2.1 深度优先迷宫生成2.2 广度优先迷宫生成 3 其它生成图案3.1 地牢地图3.2 贪吃蛇3.3 植物花 惯例声明&#xff1a;本人没有相关的工程应用经验&am…

Python爬虫抓取经过JS加密的API数据的实现步骤

随着互联网的快速发展&#xff0c;越来越多的网站和应用程序提供了API接口&#xff0c;方便开发者获取数据。然而&#xff0c;为了保护数据的安全性和防止漏洞&#xff0c;一些API接口采用了JS加密技术这种加密技术使得数据在传输过程中更加安全&#xff0c;但也给爬虫开发带来…

客路旅行(KLOOK)面试(部分)(未完全解析)

一面 用过Chatgpt的哪个版本&#xff0c;了解Chatgpt版本之间的差异吗 什么是优雅部署&#xff1f;newBing: 服务启动时&#xff0c;检查依赖的组件或容器是否就绪&#xff0c;如果不就绪&#xff0c;等待或重试&#xff0c;直到就绪后再注册到服务中心&#xff0c;对外提供服…

AcWing 844. 走迷宫 (每日一题)

给定一个 nm 的二维整数数组&#xff0c;用来表示一个迷宫&#xff0c;数组中只包含 0 或 1&#xff0c;其中 0 表示可以走的路&#xff0c;1表示不可通过的墙壁。 最初&#xff0c;有一个人位于左上角 (1,1)处&#xff0c;已知该人每次可以向上、下、左、右任意一个方向移动一…

WIFI模块的工作原理及AP模式和STA模式的区别

WiFi模块的运作原理&#xff1a; WiFi模块通常由两大核心组件构成&#xff1a;无线芯片和微处理器。无线芯片专注于处理无线信号的传送与接收&#xff0c;而微处理器则全面管理和调控WiFi模块的各项功能。数据传输过程中&#xff0c;无线芯片利用无线电波进行信号的交互。通过…

网络安全社区与资源分享: 推荐网络安全社区、论坛、博客、培训资源等,帮助从业者拓展人脉和知识。

第一章&#xff1a;引言 在当今数字化的世界中&#xff0c;网络安全问题变得愈发突出。随着各种新型威胁的涌现&#xff0c;网络安全从业者面临着持续不断的挑战。然而&#xff0c;正是因为这些挑战&#xff0c;网络安全社区应运而生&#xff0c;成为从业者们互相交流、学习和…

C语言常见字符串和内存函数详解

字符串和内存函数 1. 前言2. 求字符串长度2.1 strlen 3. 长度不受限制的字符串函数3.1 strcpy3.2 strcat3.3 strcmp 4. 长度受限制的字符串函数4.1 strncpy4.2 strncat4.3 strncmp 5. 字符串查找5.1 strstr5.2 strtok 6. 错误信息报告6.1 strerror 7. 字符操作函数7.1 字符分类…

windows使用vim编辑文本powershell

windows使用vim编辑文本 1、安装 chocolatey 包 以管理员身份打开 PowerShell 进行安装 Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(https://chocolatey.org/install.ps1))2、管理员身份打开 PowerShell 并使…

C++面试题(吴)-计算机网络部分(2)和常见设计模式

目录 1.网络部分 3.32 说说浏览器从输入 URL 到展现页面的全过程 3.33 简述 HTTP 和 HTTPS 的区别&#xff1f; 3.34 说说 HTTP 中的 referer 头的作用 3.35 说说 HTTP 的方法有哪些 3.36 简述 HTTP 1.0&#xff0c;1.1&#xff0c;2.0 的主要区别 3.37 说说 HTTP 常见的…