小项目:迷宫二

目录

  • 引言
  • 一、题目描述
  • 二、解题思路
  • 三、代码实现
  • 四、测试

引言

这个迷宫项目是今天参加学校的一个比赛出的题目,从早上九点基本搞到了四五点才完成,其实写出来发现基本思路其实挺简单的,就是想不好想,真的要各种的尝试,也训练反应和一个执行力,不过也算挺好的,现在给出题目。

一、题目描述

题目描述:
勇敢的盖伦前往诺克萨斯的地牢去解救美丽的光辉女神拉克丝,但是诺克萨斯的地牢机关重重、危机四
伏,请你帮助盖伦解救拉克丝。
诺克萨斯的地牢是一个14×14 的矩阵,该矩阵由如下几种元素组成:道路、墙壁、炸弹、传送门、怪物
组成,如下图所示:

在这里插入图片描述

解题规则
(1)盖伦拥有初始值为100的生命值,初始位置在矩阵中第2行第1列;拉克丝被关押的位置在矩阵中
第12行第13列;盖伦到达拉克丝所在的格子,则视为解救成功;
(2)白色格子为道路,盖伦可以到达;盖伦只能朝正北、正南、正东、正西这四个方向移动,每次只
能移动一格;
(3)褐色格子为墙壁,盖伦不可到达;
(4)炸弹放置在道路上,当盖伦到达该格子时则引发爆炸,盖伦自身扣除10生命值,同时炸弹将周边
(8个格子)存在的墙壁炸开变为道路,如周边存在怪物也一同炸消失;
(5)地牢中有10只小怪和3只大龙放置在道路上;当盖伦到达小怪格子,盖伦自身扣除5生命值,同时
该小怪消失;当盖伦到达大龙格子,盖伦自身扣除20生命值,同时该大龙消失;
(6)地牢中有3组传送门放置在道路上,其中A-B一组、C-D一组、E-F一组;当盖伦从别的非传送门格
子到达传送门A格子时,立即位移到传送门B格子,反之亦然;C-D传送门,E-F传送门同理。
问题求解
(1)盖伦是否能在存活的情况下,解救拉克丝?
(2)哪种解救方案(盖伦移动的路径)可以让盖伦扣除最少的生命值?
(3)自行设计一个 20×20 的地牢,其中至少包含12个炸弹、15只小怪、6只大龙、6组传送门;墙壁
的个数至少是所有格子的一半;盖伦初始位置在第1行第1列,拉克丝被关押的位置在第20行第20列;
同时求解上述两个问题;

二、解题思路

就是不断地dfs然后递归到终点,否则回退,再递归,再到终点的话就更新

三、代码实现

#if 1

#include <iostream>
#include <vector>
#include <unordered_map>
#include <cstring>
using namespace std;

const int N = 14;
const int MAZE_SIZE = 14;

//0为通路 1为墙壁 2为炸弹 3为大怪兽 4为小怪兽 6为传送门 8为终点
int maze[N][N] = {
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1},  //0
	{0,0,0,0,0,0,1,1,1,0,0,0,0,1},  //1
	{1,0,1,2,1,0,4,0,2,1,1,1,2,1},  //2
	{1,0,1,4,1,1,1,1,1,1,0,4,0,1},  //3
	{1,0,1,6,1,0,6,0,1,0,0,1,1,1},  //4
	{1,0,1,1,1,3,0,0,1,0,4,1,3,1},  //5
	{1,4,0,0,1,1,1,1,1,6,0,1,6,1},  //6
	{1,0,1,0,1,0,0,4,0,0,0,1,0,1},  //7
	{1,0,1,0,4,2,1,1,1,1,4,1,1,1},  //8
	{1,2,0,6,1,0,0,0,1,1,0,2,0,1},  //9
	{1,1,1,1,1,1,1,0,0,1,0,1,1,1},  //10
	{1,0,0,3,0,0,1,4,2,1,0,1,8,1},  //11
	{1,0,4,1,0,6,1,0,0,1,0,0,0,1},  //12
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1}   //13
};



int traverse[N];
vector<pair<int, int>> res;
vector<pair<int, int>> step;
int dir[4][2] = { 0,1,1,0,-1,0,0,-1 };
bool used[N][N];  

int hp_res = -1;

int get1(int x, int y)
{
	return x * 14 + y;
}

pair<int, int> get2(int n)
{
	pair<int, int> res;
	res.first = n / 14;
	res.second = n % 14;
	return res;
}

void init()
{
	//传送门
	//a[9,3] b[12,5] c[4,3] d[5,6] e[6,9] f[6,12]
	traverse[get1(9, 3)] = (get1(12, 5));
	traverse[get1(12, 5)] = (get1(9, 3));
	traverse[get1(4, 3)] = (get1(4, 6));
	traverse[get1(4, 6)] = (get1(4, 3));
	traverse[get1(6, 9)] = (get1(6, 12));
	traverse[get1(6, 12)] = (get1(6, 9));

	used[1][0] = true;
	step.push_back({ 1,0 });
}

void bomb(int x, int y)
{
	int dir[9][2] = { -1,-1,-1,0,-1,1,0,-1,0,0,0,1,1,-1,1,0,1,1 };
	for (int i = 0; i < 9; ++i)
	{
		int nx = x + dir[i][0];
		int ny = y + dir[i][1];

		if (nx < 0 || nx >= MAZE_SIZE || ny < 0 || ny >= MAZE_SIZE) continue;

		maze[nx][ny] = 0;
	}
}

void dfs(int startx, int starty, int cur_hp)
{
	if (cur_hp < 0) return;
	if (hp_res != -1 && cur_hp < hp_res) return;

	for (int i = 0; i < 4; ++i)
	{
		int nx = startx + dir[i][0];
		int ny = starty + dir[i][1];

		if (nx < 0 || nx >= MAZE_SIZE || ny < 0 || ny >= MAZE_SIZE) continue;
		if (used[nx][ny] || maze[nx][ny] == 1) continue;

		if (maze[nx][ny] == 0)  //通路
		{
			used[nx][ny] = true;
			step.push_back({ nx,ny });

			dfs(nx, ny,cur_hp);

			used[nx][ny] = false;
			step.pop_back();
		}
		else if (maze[nx][ny] == 2)  //炸弹
		{
			used[nx][ny] = true;
			int backup[N][N] = {0};
			memcpy(backup, maze, sizeof maze);
			bomb(nx, ny);
			step.push_back({ nx,ny });

			dfs(nx, ny,cur_hp-10);

			used[nx][ny] = false;
			step.pop_back();
			memcpy(maze, backup, sizeof maze);
		}
		else if (maze[nx][ny] == 3)  //大怪兽
		{
			used[nx][ny] = true;
			maze[nx][ny] = 0;
			step.push_back({ nx,ny });

			dfs(nx, ny,cur_hp - 20);

			used[nx][ny] = false;
			step.pop_back();
			maze[nx][ny] = 3;
		}
		else if (maze[nx][ny] == 4)  //小怪兽
		{
			used[nx][ny] = true;
			maze[nx][ny] = 0;
			step.push_back({ nx,ny });

			dfs(nx, ny,cur_hp-5);

			used[nx][ny] = false;
			step.pop_back();
			maze[nx][ny] = 4;
		}
		else if (maze[nx][ny] == 6)  //传送门
		{
			used[nx][ny] = true;
			int t = get1(nx, ny);
			pair<int, int> next = get2(traverse[t]);
			step.push_back({ nx,ny });
			step.push_back({ next.first,next.second });

			dfs(next.first, next.second,cur_hp);

			used[nx][ny] = false;
			step.pop_back();
			step.pop_back();
		}
		else if(maze[nx][ny] == 8)  //终点
		{
			step.push_back({ nx,ny });
			if (cur_hp > hp_res)
			{
				hp_res = cur_hp;
				res = step;
			}
			step.pop_back();

			return;
		}

		
		
	}
}

int main()
{
	init();
	dfs(1, 0,100);
	if (hp_res <= 0)
	{
		cout << "false" << endl;
	}
	else
	{
		cout << "true" << endl;
		cout << hp_res << endl;
		int cnt = 1;
		for (int i = 0; i < res.size(); ++i)
		{
			printf("(%02d,%02d)", res[i].first, res[i].second);
			if (cnt % 10 == 0) puts("");
			else if(i != res.size() - 1) printf("->");
			cnt++;
		}
	}
	
	return 0;
}

#endif

四、测试

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式(2)--对象创建(5)--单件

1. 意图 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 2. 一种角色 单件(Singleton) 3. 优点 3.1 对唯一实例的受控访问 3.2 缩小名空间(对全局变量的改进) 3.3 允许对操作和表示精化(可以有子类) 3.4 允许可变数目的实例 3.5 比类操作更灵活 4. 缺点…

ReenterLock重入锁

synchronized就是一种最简单的控制方法&#xff0c;它决定了一个线程释放可以访问临界区资源。 同时&#xff0c;Object.wait()方法和Object.notify()方法起到了线程等待和通知的作用。 ReenterLock重入锁可以完全替代关键字Synchoronized.重入锁是Synchoronized、Object.wait(…

reactive数据不响应

我们知道&#xff0c;reactive函数用于创建对象等复杂数据的响应式代理对象&#xff0c;当该对象的属性发生变化时&#xff0c;会自动触发视图更新。 但在Vue 3中&#xff0c;当我们使用reactive创建的对象或数组进行赋值时&#xff0c;尽管能够完成正常的赋值操作&#xff0c…

RK3568平台(网络篇)添加网络交换芯片RTL8306M

一.硬件原理图 分析&#xff1a; 该交换芯片支持I2C、SPI、mdio通信&#xff0c;但是看ast1520的uboot代码采用的是mdio去通信phy芯片的&#xff0c;所以暂时也先采用mdio的方式&#xff0c;需要配置相应的引脚才可以配置成mdio通信模式&#xff0c;具体的配置硬件工程师解决。…

HarmonyOS开发实战:如何实现一个运动排名榜页面

HarmonyOS开发实战&#xff1a;如何实现一个运动排名榜页面 代码仓库&#xff1a; 运动排名榜页面 项目介绍 本项目使用声明式语法和组件化基础知识&#xff0c;搭建一个可刷新的排行榜页面。在排行榜页面中&#xff0c;使用循环渲染控制语法来实现列表数据渲染&#xff0c;…

linux添加环境变量

一、查看当前环境变量 echo $PATH 二、将工作空间添加到环境变量&#xff0c;vim是编辑器&#xff0c;可以换成别的编辑器&#xff0c;vim编辑器的使用法可以百度一下 vim ~/.bashrc编辑器添加&#xff1a; source ~/scan_ws/devel/setup.bash

os功能模板

【 一 】简介 os 就是 “operating system” 的缩写&#xff0c;顾名思义&#xff0c;os 模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用 os 模块&#xff0c;一方面可以方便地与操作系统进行交互&#xff0c;另一方面页可以极大增强代码的可移植性。如果该…

深入理解JVM虚拟机第三十二篇:详解JVM当中本地方法栈

😉😉 欢迎加入我们的学习交流群呀! ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring等等很多应用和源码级别的高质量视频和笔记资料,你想学的我们这里都有! 🥭🥭3:QQ群:583783824 📚📚 工作VX:BigTreeJava 拉你…

Python框架篇(5):FastApi-中间件使用

1.介绍 1.1 官网介绍 "中间件"是一个函数,它在每个请求被特定的路径操作处理之前,以及在每个响应返回之前工作. 它接收你的应用程序的每一个 请求. 然后它可以对这个 请求做一些事情或者执行任何需要的代码. 然后它将 请求传递给应用程序的其他部分 (通过某种 路径操…

全球汽车行业的数字化转型:产品和后端的渐进之旅

如何管理汽车行业的数字化转型?在我们本篇文章中了解更多有关如何设定长期目标的信息。 正在改变汽车行业的26个数字化主题 最近一篇关于汽车行业数字化转型的论文确定了26个数字技术主题&#xff08;论文详情请点击阅读原文&#xff09;&#xff0c;分为三个主要集群: 1)驾驶…

添加E1000网卡进行测试,只有VMXNET3性能的四分之一

正文共&#xff1a;1444 字 14 图&#xff0c;预估阅读时间&#xff1a;2 分钟 我们前面介绍了VMware ESXi 6.7中的适配器类型性能&#xff08;VMWare ESXi中&#xff0c;不同的虚拟网卡性能竟然能相差三倍&#xff01;&#xff09;&#xff0c;当时的配置项主要为E1000e和VMXN…

【LangChain学习之旅】—(3) LangChain快速构建本地知识库的智能问答系统

【LangChain学习之旅】—&#xff08;3&#xff09; LangChain快速构建本地知识库的智能问答系统 项目及实现框架开发框架核心实现机制数据准备及加载加载文本文本的分割向量数据库存储文本的“嵌入”概念向量数据库概念 相关信息获取RetrievalQA生成回答并展示示例小结 Refere…

MathBuddyGUI:MATLAB多功能计算器,2060行代码

是我做的一个MATLAB课设&#xff0c;是一个带画图、输出模式转换、简单控制系统仿真等功能的计算器。练习GUI编程用。 仓库链接&#xff1a; MathBuddyGUI: MATLAB课设&#xff0c;一个带画图、输出模式转换、简单控制系统仿真等功能的计算器&#xff0c;练习GUI编程用。 (gi…

C++——C++11(1)

时至今日&#xff0c;C标准已经到了C23&#xff0c;但是你要说哪一次提出的标准最经 典&#xff0c;那C11一定会被人提及&#xff0c;C11带来了数量可观的变化&#xff0c;其中包 含了约140个新特性&#xff0c;以及对C03标准中约600个缺陷的修正&#xff0c;这使得 C11更像是从…

在用 App 设计工具创建的 App 内共享数据

目录 定义属性 访问属性 示例 共享绘图数据和下拉列表选择 使用属性是在 App 内共享数据的最佳方法&#xff0c;因为属性可供 App 内的所有函数和回调访问。所有 UI 组件都是属性&#xff0c;因此可以使用以下语法来访问和更新回调中的 UI 组件&#xff1a; app.Component…

Java 第12章 异常 本章作业

1 编程 两数相除的异常处理 各自属于哪些异常&#xff1a; 数据格式不正确 NumberformatException 缺少命令行参数 ArrayIndexOutOfBoundsException 除0异常处理 ArithmeticException ArrayIndexOutOfBoundsException 为数组下标越界时会抛出的异常&#xff0c;可以在检测到命…

计算机网络知识点

计算机网络中的OSI模型 OSI模型是指“国际标准化组织(SO)”提出的使各种计算机在世界范围内互通互联的网络标准框架简称开放系统互联参考模型 (OSI)。 七层模型&#xff1a;应用层、表示层、会话层、传输层、网络层&#xff08;IP协议、RARP协议、ARP协议、CIDR协议&#xff0…

0x31 质数

0x31 质数 定义&#xff1a; 若一个正整数无法被除了1和它自身之外的任何自然数整除&#xff0c;则称该数为质数&#xff08;或素数&#xff09;&#xff0c;否则则称该正整数为合数。 在整个自然数集合中&#xff0c;质数的数量不多&#xff0c;分布比较稀疏&#xff0c;对…

机器学习项目精选 第一期:超完整数据科学资料合集

大噶吼&#xff0c;不说废话&#xff0c;分享一波我最近看过并觉得非常硬核的资源&#xff0c;包括Python、机器学习、深度学习、大模型等等。 1、超完整数据科学资料合集 地址&#xff1a;https://github.com/krishnaik06/The-Grand-Complete-Data-Science-Materials Pytho…

strlen的三种模拟实现方法

首先&#xff0c;我们要了解strlen函数的参数以及返回值&#xff0c;还有使用方法。 1. 计数器方法 #include <stdio.h>size_t my_strlen(const char* str) {int count 0;while (*str) {count;}return count; } int main() {char arr[] "abcdef";int len …