列表

详情


NC229960. 小红的rpg游戏

描述

小红正在玩一个游戏。游戏的地图是一个n*m的迷宫,迷宫有墙和道路,道路上可能会有一些怪物。
小红初始的血量是 h ,每当小红经过一个有怪物的道路时,小红就会和怪物战斗,击杀怪物并且消耗自己的血量。小红消耗的血量等同于该怪物的战斗力。请注意,如果小红血量为0则死亡。因此只有当小红当前血量大于怪物的战斗力时才可经过该点。
地图共有以下几种标识:
'.' 代表道路,小红可以经过。
'*' 代表墙体,小红不能经过。
'1'~'9' 数字,代表该位置是个道路,且上面有一个战斗力为该数字的怪物。
小红只可以上下左右四个方向移动。
小红想知道,自己从左上角到右下角的最短行走路线的距离是多少?

输入描述

第一行三个正整数 nmh ,用空格隔开。
接下来的 n 行,每行一个长度为 m 的字符串,用来表示地图。保证输入是合法的。
数据范围:
,且怪物的数量不超过10个。保证左上角和右下角都是道路且没有怪物。

输出描述

如果小红无法到达右下角,则输出-1。否则输出一个正整数,代表小红走的路径长度最小值。

示例1

输入:

3 3 3
.11
.*.
22.

输出:

4

说明:

小红先向右走两步,再向下走两步,可到达右下角。中途击杀两只战斗力为1的怪物,剩余血量为1。若小红先向下走,则无法击杀两只血量为2的怪物,无法到达终点。

示例2

输入:

3 3 3
.12
.*.
21.

输出:

-1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 84ms, 内存消耗: 75380K, 提交时间: 2022-08-05 10:43:43

n,m,h = [int(x) for x in input().split()]
mg=[]
d={'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,'.':0,'*':999}
dirc=[(0,1),(0,-1),(1,0),(-1,0)]
for _ in range(n):
    mg.append([d[x] for x in input()])
mg2=[[[9999,0] for x in y] for y in mg]
road=[[0,0,0,h]]
res=10000
while road:
    a,b,step,h = road.pop(0)
    if a==n-1 and b==m-1 and step<res:
        res=step
        continue
    #mg2[a][b] =1
    h= h - mg[a][b]
    step = step+1
    for i in range(4):
        x = a + dirc[i][0]
        y = b + dirc[i][1]
        if x >=0 and y>=0 and x<n and y<m and (mg2[x][y][0]>step or h>mg2[x][y][1])  and h>mg[x][y]:
            mg2[x][y][0]=step
            mg2[x][y][1]=h
            road.append([x,y,step, h])

if res<10000:
    print(res)
else:
    print(-1)

C++ 解法, 执行用时: 3ms, 内存消耗: 456K, 提交时间: 2021-12-04 20:48:47

#include<bits/stdc++.h>
using namespace std;
int n,m,h,ans=100000;
bool vis[55][55];char mp[55][55];
void dfs(int x,int y,int h,int step)
{
	if(x<=0||x>n||y<0||y>=m||h<=0||mp[x][y]=='*'||vis[x][y]) return ;
	if(x==n&&y==m-1){
		ans=min(ans,step);
		return ;
	}
	 vis[x][y]=1;
	if(mp[x][y]=='.'){
		dfs(x+1,y,h,step+1);
		dfs(x-1,y,h,step+1);
		dfs(x,y+1,h,step+1);
		dfs(x,y-1,h,step+1);
	}
	else{
		int s=mp[x][y]-'0';
		dfs(x+1,y,h-s,step+1);
		dfs(x-1,y,h-s,step+1);
		dfs(x,y+1,h-s,step+1);
		dfs(x,y-1,h-s,step+1);
	}
	vis[x][y]=0;
 } 
 int main()
 {
 	cin>>n>>m>>h;
 	for(int i=1;i<=n;i++)
 	   cin>>mp[i];
 	dfs(1,0,h,0);
 	if(ans==100000) cout<<"-1"<<endl;
 	else cout<<ans<<endl;
 }

上一题