首页 > 其他分享 >P2802 回家 解题报告

P2802 回家 解题报告

时间:2023-06-22 23:45:54浏览次数:47  
标签:10 int P2802 hp 回家 step 解题 ans book

P2802 回家 解题报告


Link

1. problem

点击查看题目

回家

题目描述

小 H 在一个划分成了 \(n \times m\) 个方格的长方形封锁线上。 每次他能向上下左右四个方向移动一格(当然小 H 不可以静止不动), 但不能离开封锁线,否则就被打死了。 刚开始时他有满血 \(6\) 点,每移动一格他要消耗 \(1\) 点血量。一旦小 H 的血量降到 \(0\), 他将死去。 他可以沿路通过拾取鼠标(什么鬼。。。)来补满血量。只要他走到有鼠标的格子,他不需要任何时间即可拾取。格子上的鼠标可以瞬间补满,所以每次经过这个格子都有鼠标。就算到了某个有鼠标的格子才死去, 他也不能通过拾取鼠标补满 HP。 即使在家门口死去, 他也不能算完成任务回到家中。

地图上有五种格子:

0:障碍物。

1:空地, 小 H 可以自由行走。

2:小 H 出发点, 也是一片空地。

3:小 H 的家。

4:有鼠标在上面的空地。

小 H 能否安全回家?如果能, 最短需要多长时间呢?

输入格式

第一行两个整数 \(n,m\), 表示地图的大小为 \(n \times m\)。

下面 \(n\) 行, 每行 \(m\) 个数字来描述地图。

输出格式

一行, 若小 H 不能回家, 输出 -1,否则输出他回家所需最短时间。

样例 #1

样例输入 #1

3 3
2 1 1
1 1 0
1 1 3

样例输出 #1

4

提示

对于所有数据,\(1 \le n,m \le 9\)。

2. 思路

1. 题意

判断小H是否能够回家.

  1. 如果不能,输出-1.
  2. 如果能,输出最短路径.

2. 算法

使用\(DFS\)算法,从起点开始,如果能走,就把这个点记录,然后继续搜索.

3. 实现

  1. 定义和初始化:
int dx[4]={1,0,-1,0};//增量数组
int dy[4]={0,1,0,-1};//增量数组
int a[10][10];
int book[10][10][8];
int n,m;
int sx,sy;
int ans=0x7fffffff;
memset(book,0x3f,sizeof(book));
  1. 输入(夹带搜索出起点)
cin>>n>>m;
for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		cin>>a[i][j];
		if(a[i][j]==2)
			sx=i,sy=j;
	}
  1. 进行\(DFS\)
    (1) 设置终止条件
if(a[x][y]==3)
{
	ans=step;
	return;
}

(2) 进行搜索

if(a[x][y]==4)
	hp=6;
if(hp<=1 || step>=ans || a[x][y]==0 || step>=book[x][y][hp])
	return;
book[x][y][hp]=step;
for(int i=0;i<4;i++)
{
	int nx=x+dx[i];
	int ny=y+dy[i];
	dfs(nx,ny,step+1,hp-1);
}
return;
  1. 输出
if(ans<0x7ffffff)
	cout<<ans;
else 
	cout<<"-1";

3. 整体代码

#include <bits/stdc++.h>
using namespace std;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int a[10][10];
int book[10][10][8];
int n,m;
int sx,sy;
int ans=0x7fffffff;
void dfs(int x,int y,int step,int hp)
{
	if(a[x][y]==3)
	{
		ans=step;
		return;
	}
	if(a[x][y]==4)
		hp=6;
	if(hp<=1 || step>=ans || a[x][y]==0 || step>=book[x][y][hp])
		return;
	book[x][y][hp]=step;
	for(int i=0;i<4;i++)
	{
		int nx=x+dx[i];
		int ny=y+dy[i];
		dfs(nx,ny,step+1,hp-1);
	}
	return;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			if(a[i][j]==2)
				sx=i,sy=j;
		}
	memset(book,0x3f,sizeof(book));
	dfs(sx,sy,0,6);
	if(ans<0x7ffffff)
		cout<<ans;
	else 
		cout<<"-1";
	return 0;
}

标签:10,int,P2802,hp,回家,step,解题,ans,book
From: https://www.cnblogs.com/tlmyb/p/17498580.html

相关文章

  • 「解题报告」CF1621G Weighted Increasing Subsequences
    比较套路的拆贡献题。考虑直接枚举那个\(j\),求有多少包含\(j\)的上升子序列满足这个子序列最后一个数的后面有大于\(a_j\)的数。首先对于\(j\)前面的选择方案是没有影响的,可以直接拿树状数组DP一遍得到。后面的过程我们可以找到从后往前第一个大于\(a_j\)的数的位置......
  • 「解题报告」CF1810G The Maximum Prefix
    水篇题解。最大值并不好考虑,我们尝试拆贡献,求最大值小于等于\(k\)的概率,然后将概率差分一下即可得到恰好等于\(k\)的概率,而最大值小于等于\(k\)的概率是很容易通过一个\(O(n^2)\)DP求出来的,但是这样我们还需要再枚举一个\(k\),复杂度\(O(n^3)\),难以接受。那么我们可以......
  • 「解题报告」P8861 线段
    有趣ds题。首先有一个部分分\(l_i\le10^5\ler_i\)。发现这相当于可以把区间分成左右两部分,那么我们可以考虑将左右分开考虑。我们将每个区间拆开成两部分,这样插入的时候就直接插入即可,修改操作时,发现实际上就是将左端所有长度大于\(10^5-l\)的区间长度改为\(10^5-......
  • CF542C 解题分析
    1题目大意1.1题目翻译:给定一个值域为\([1,n]\)的函数\(f(x)\),让你求出最小的\(k\),其中\(k\)满足\(f^{(2k)}(x)=f^{(k)}(x)\)。其实我觉得这题你谷翻译十分到位,建议没读懂题的还是去看你谷翻译罢。1.2数据范围:对于\(100\%\)的数据:\(1\leqn\leq200\)1.3......
  • [NOIP2020] 移球游戏 解题报告
    题目描述给定\(n+1\)个栈,栈的高度限制为\(m\)。初始时前\(n\)个上每个有\(m\)个球,最后一个为空。球分为\(n\)种颜色,每种恰好\(m\)个。一次操作可以把一个栈顶的元素弹出放到一个另一个栈顶,但是不可以使栈溢出或下溢。现要把同种颜色的球移动到同一个栈上,你需要构造一......
  • [网络安全] DVWA之 Command Injection 攻击姿势及解题详析合集
    CommandInjection命令注入(CommandInjection)是一种安全漏洞,发生在应用程序使用用户提供的输入作为系统命令的一部分而未经充分验证和过滤的情况下。当应用程序在构造系统命令时,如果没有对用户输入进行适当的验证和过滤,攻击者可以通过在用户输入中插入恶意命令来执行任意系统命......
  • CF521E Cycling City 解题报告
    题面一道难得恰到好处的构造题。分析因为要构造三条从\(s\)到\(t\)的路径,且三条路径中任意两条路径经过的点集的交集等于\(\{s,t\}\)。我们知道当两条路径经过的点集的交集等于\(\{s,t\}\)时,这两条路径将会构成一个环。因此题意转化为要求我们找到两个经过的边集有重合......
  • [网络安全] DVWA之CSRF攻击姿势及解题详析合集
    CSRFCSRF(Cross-SiteRequestForgery,跨站请求伪造)是一种常见的Web应用程序安全漏洞,它利用了用户在已认证的网站中的身份,通过欺骗用户发起非预期的请求。攻击者会构造一个恶意网页,使用户在浏览器中访问该网页时,自动向目标网站发送了未经用户授权的请求。CSRF攻击的原理是利用了W......
  • [网络安全] DVWA之 Insecure CAPTCHA 攻击姿势及解题详析合集
    InsecureCAPTCHACAPTCHA(CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart,全自动区分计算机和人类的图灵测试)是一种常用的人机验证机制,旨在防止恶意机器人或自动化程序对网站进行滥用或攻击。reCAPTCHA验证流程如下:网站集成:网站管理员在网站上集......
  • 「解题报告」HDU6358 Innocence
    其实挺简单的,但是考场上状态太差没推出来,暴力还挂了。麻了。首先看题:发现,这不是我们异或FWT的题吗,下次出题记得标明出处容易发现,我们实际上要求的就是集合幂级数\([x^k](x^l+x^{l+1}+\cdots+x^{r-1}+x^r)^n\)。考虑直接手动模拟FWT。设\(F(l,r)=FWT(x^l+......