小项目:迷宫二

news2024/11/27 6:23:32

目录

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

引言

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

一、题目描述

题目描述:
勇敢的盖伦前往诺克萨斯的地牢去解救美丽的光辉女神拉克丝,但是诺克萨斯的地牢机关重重、危机四
伏,请你帮助盖伦解救拉克丝。
诺克萨斯的地牢是一个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

四、测试

在这里插入图片描述

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

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

相关文章

【数据分析之Numpy】Numpy中复制函数numpy.repeat()与numpy.tile()的使用方法及区别

一、简介 numpy.repeat()与numpy.tile()都是Numpy库中的复制函数&#xff0c;用于将数组中的元素重复指定的次数。 numpy.repeat()函数接受三个参数&#xff1a;要重复的数组、重复的次数和重复的轴。 numpy.tile()函数接受两个参数&#xff1a;要重复的数组和重复的次数。 二…

C语言学习第二十六天(算法的时间复杂度和空间复杂度)

1、算法效率 衡量一个算法的好坏&#xff0c;是从时间和空间两个方面来衡量的&#xff0c;换句话说就是从时间复杂度和空间复杂度来衡量的 这里需要补充一点&#xff1a;时间复杂度是衡量一个算法的运行快慢&#xff0c;空间复杂度是主要衡量一个算法运行所需要的额外空间。 …

面试 Java 算法高频题五问五答第一期

面试 Java 算法高频题五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;括号生成: 数字 n 代表生成括号的对数&#xff0c;请你设计一个…

neuq-acm预备队训练week 10 P1129 [ZJOI2007] 矩阵游戏

题目描述 小 Q 是一个非常聪明的孩子&#xff0c;除了国际象棋&#xff0c;他还很喜欢玩一个电脑益智游戏――矩阵游戏。矩阵游戏在一个 nn 黑白方阵进行&#xff08;如同国际象棋一般&#xff0c;只是颜色是随意的&#xff09;。每次可以对该矩阵进行两种操作&#xff1a; 行…

STM32F103RCT6开发板M3单片机教程04--按键检测

原画图讲解 本教程使用是&#xff08;光明谷SUN_STM32mini开发板&#xff09; 首先了硬件连接原理&#xff0c;STM32F103RCT6开发板是mini最小系统板&#xff0c;板子在没并有按键。需要自行用面包板搭建。 硬件连接&#xff1a; PC10 -> KEY1 &#xff08;MCU内部上拉…

创投课程第五期 | 超越比特币:探索BTC生态的无限可能

协会邀请了来自水滴资本&#xff08;Waterdrip Capital&#xff09;的投资总监——Elaine&#xff0c;作为VC创投课程第5期的嘉宾&#xff0c;在北京时间12月17日(周日)晚上21:00 PM-22:00 PM&#xff0c;届时将与所有对Web3投资、创业心怀热忱的朋友们共同探讨《超越比特币&am…

TCP/IP详解——DNS 流量分析

文章目录 1. DNS 流量分析1.1 DNS 基本概念1.2 DNS 系统特性1.3 DNS 效率问题1.4 域名的组成1.5 域名解析系统1.5.1 域名解析过程 1.6 DNS 记录种类1.7 DNS 的报文格式1.7.1 DNS 报文中的基础结构部分1.7.2 DNS 查询报文中的问题部分1.7.3 DNS 响应报文中的资源记录部分1.7.4 示…

Unity中URP下的菲涅尔效果实现(个性化修改)

文章目录 前言一、我们修正一下上篇文章中&#xff0c;可能遗留的Bug1、N向量 变为 单位向量2、使颜色范围在合理区间 二、实现菲涅尔效果强弱可自定义调节三、修改菲涅尔效果颜色1、在属性面板定义颜色属性2、在常量缓冲区申明该参数3、在片元着色器中&#xff0c;用颜色和菲涅…

数据结构 AVL树概念以及实现插入的功能(含Java代码实现)

为啥要有avl树 avl树是在二叉搜索树下的一种进阶形式,是为了防止二叉搜索树在极端情况下产生的链表化的场景,从而在二叉搜索树的基础上,加上了某些条件来阻止这种极端情况的产生,但不是保证完全平衡,而是放开了一定的条件,使得这种情况不那么难以满足.(条件:左右子树的高度差的…

【Vulnhub 靶场】【IA: Keyring (1.0.1)】【中等】【20210730】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/ia-keyring-101,718/ 靶场下载&#xff1a;https://download.vulnhub.com/ia/keyring-v1.01.ova 靶场难度&#xff1a;中等 发布日期&#xff1a;2021年07月30日 文件大小&#xff1a;1.1 GB 靶场作者&#xf…

Day63力扣打卡

打卡记录 寻找最近的回文数&#xff08;模拟&#xff09; 链接 class Solution:def nearestPalindromic(self, n: str) -> str:m len(n)candidates [10 ** (m - 1) - 1, 10 ** m 1]selfPrefix int(n[:(m 1) // 2])for x in range(selfPrefix - 1, selfPrefix 2):y …

ArcMap自定义脚本工具箱迁移至ArcGIS pro

本文记录了将ArcMap10.7创建的自定义脚本工具箱&#xff08;.tbx&#xff09;迁移至ArcGIS pro的过程 ArcGIS Pro使用的是python版本与ArcMap不同&#xff0c;前者为python3&#xff0c;后者为python2。由于python3 和 python2 的部分语法不兼容&#xff0c;以及一些地理处理工…

性能测试之Artillery(示例及指标)

官方文档&#xff1a;https://www.artillery.io/docs/get-started/first-test PS:文档挺详细&#xff0c;教程比较全 示例 config:http:extendedMetrics: truetarget: http://127.0.0.1:8005phases:- duration: 10 # 持续时间arrivalRate: 10 # 每秒创建10个用户rampTo: 100 …

【漏洞复现】CVE-2023-6848 kodbox远程命令执行

漏洞描述 kodbox 是一个网络文件管理器。它也是一个网页代码编辑器,允许您直接在网页浏览器中开发网站。您可以在基于 Linux、Windows 或 Mac 的平台上在线或本地运行 kodbox。唯一的要求是要有 PHP 5及以上。 kalcaddle kodbox 中发现漏洞,最高版本为 1.48。它已被宣布为关…

LV.13 D5 uboot概述及SD卡启动盘制作 学习笔记

一、uboot概述 1.1 开发板启动过程 开发板上电后首先运行SOC内部iROM中固化的代码(BL0)&#xff0c;这段代码先对基本的软硬件环境(时钟等...)进行初始化&#xff0c;然后再检测拨码开关位置获取启动方式&#xff0c;然后再将对应存储器中的uboot搬移到内存&#xff0c;然后跳…

目标跟踪 MOT数据集和可视化

目录 MOT15数据集格式简介 gt可视化 本人修改的GT可视化代码&#xff1a; MOT15数据集格式简介 以下内容转自&#xff1a;【目标跟踪】MOT数据集GroundTruth可视化-腾讯云开发者社区-腾讯云 MOT15数据集下载&#xff1a;https://pan.baidu.com/s/1foGrBXvsanW8BI4eybqfWg?…

机器学习算法---时间序列

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

vue3中ref及reactive的说明

目录 1.响应式说明 2.vue3的ref及reactive的使用 3.reactive响应式失效问题 4.总结 1.响应式说明 vue的响应式是vue框架中的核心概念之一&#xff0c;它是指当数据发生变化时&#xff0c;vue能够自动更新视图。vue2的响应式是基于Object.defineProperty进行实现的。 当你把…

安全密码(字符串)

#include <stdio.h> #include <stdbool.h> #include <string.h> bool is_secure_password(const char* password); int main() {int M;char password[51];// 读取输入中的密码数量 Mscanf("%d", &M);// 处理每个密码for (int i 0; i < M; …

智慧校园2.0物联网管理平台建设方案:PPT全文22页,附下载

关键词&#xff1a;物联网解决方案&#xff0c;智慧校园解决方案&#xff0c;物联网平台建设方案&#xff0c;物联网应用技术 一、智慧校园2.0物联网管理平台建设背景 1、教育现代化和强国建设的需要&#xff1a;近年来&#xff0c;国家为了加快推进教育现代化、教育强国建设…