题目:
小H在一个划分成了n*m个方格的长方形封锁线上。 每次他能向上下左右四个方向移动一格(当然小H不可以静止不动), 但不能离开封锁线,否则就被打死了。 刚开始时他有满血6点,每移动一格他要消耗1点血量。一旦小H的 血量降到 0, 他将死去。 他可以沿路通过拾取鼠标(什么鬼。。。)来补满血量。只要他走到有鼠标的格子,他不需要任何时间即可拾取。格子上的鼠标可以瞬间补满,所以每次经过这个格子都有鼠标。就算到了某个有鼠标的格子才死去, 他也不能通过拾取鼠标补满 HP。 即使在家门口死去, 他也不能算完成任务回到家中。
地图上有 5 种格子:
数字 0: 障碍物。
数字 1: 空地, 小H可以自由行走。
数字 2: 小H出发点, 也是一片空地。
数字 3: 小H的家。
数字 4: 有鼠标在上面的空地。
小H能否安全回家?如果能, 最短需要多长时间呢?
解析
这道题
又是迷宫题
在迷宫题的基础上
还加了一个:血量
有以下几个重点:
1,“ 一旦小H的 血量降到 0, 他将死去 ”,也就是说当小 H 血量为 1,且本格不能补充,就已经可以视为死亡了。我的做法是在每次递归开始时判断,如果鼠标数量为 0 就直接返回。
2,“ 他可以沿路通过拾取鼠标(什么鬼。。。)来补满血量 ” 即每次遇到可以拾取鼠标的点后鼠标数量回到 6。
血量如果为零
就算回到了家也不行
所以
同志们
有时我们需要
绕远路
来补充血量
这是一个重点
还有
第11个样例
可能出了点问题
下面是代码
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int xx2[5]={0,1,0,-1,0};
int yy2[5]={0,0,1,0,-1};
int flag[100][100];
int n,m,a[100][100],sum=INT_MAX,xxx,yyy,z=1;
int ddd(int xxx2,int yyy2,int aaa,int xxx)
{
xxx--;
if(xxx>0)
{
for(int i=1;i<=4;i++)
{
int x2x,y2y;
x2x=xxx2+xx2[i];
y2y=yyy2+yy2[i];
if(a[x2x][y2y]!=0)
{
if(x2x>=1&&x2x<=n&&y2y>=1&&y2y<=m&&flag[x2x][y2y]==0)
{
flag[x2x][y2y]=1;
if(a[x2x][y2y]==3)
{
aaa++;
if(aaa<=sum)
sum=aaa;
aaa--;
}
if(a[x2x][y2y]==4)
{
ddd(x2x,y2y,aaa+1,6);
// cout<<x2x<<" "<<y2y<<" "<<aaa<<" "<<xxx<<endl;
}
if(a[x2x][y2y]==1)
{
ddd(x2x,y2y,aaa+1,xxx);
// cout<<x2x<<" "<<y2y<<" "<<aaa<<" "<<xxx<<endl;
}
flag[x2x][y2y]=0;
}
}
}
}
}
int main()
{
memset(flag,0,sizeof(flag));
bool flaggggg=true;
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&&flaggggg==true)
{
xxx=i;
yyy=j;
flaggggg=false;
}
}
flag[xxx][yyy]=1;
ddd(xxx,yyy,0,6);
if(sum==INT_MAX) cout<<"-1"<<endl;
else cout<<sum<<endl;
return 0;
}