洛谷P2802回家

洛谷P2802回家

        • 题目:
        • 解析
        • 代码:

题目:

小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
#include
#include
#include
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<
					}
                    if(a[x2x][y2y]==1) 
					{
						ddd(x2x,y2y,aaa+1,xxx);	
					//	cout<
					}	
					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;
}

你可能感兴趣的:(洛谷P2802回家)