3 条题解

  • -4
    @ 2022-4-24 17:49:48

    写题解请注意

    鼓励大家写题解,但注意题解格式。

    题解一定要有思路解析或代码注释,能否让别人理解你的思路

    也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

    给代码两端加上这个会舒服一些

    ```cpp

    你的代码

    ```

    </span>

    这个点在键盘的左上角tab上面那个键,注意切换输入法

    #include<iostream>
    using namespace std;
    int main()
    {
        int n;
        cin>>n;//这是一个注释
        return 0;
    } 
    

    请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

    抄袭题解一经发现直接取消成绩。

    题解被删除的可能

    1. 代码不符合格式规范
    2. 没有思路讲解或者没有注释,
    3. 无意义的题解

    大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

    • -4
      @ 2022-4-19 22:37:50

      严禁抄题解,发现后取消成绩

      • -4
        @ 2021-12-22 17:05:15
        
        本题并不是所有的点只能走一次就可以,因为有一个hp血量的存在,所以不能直接求出发点到家的
        
        最短次数。如果不重复走某些格子,可能还没走到就死了。所以考虑是否重复走某些格子的时候,
        
        主要看这次走的时候目前的血量是否高于前一次走的血量,如果高于就可以走。用vis数组记录经过
        
        这个时的最大hp,bfs把能走的加入队列,走重复点的时候如果当前hp大于之前那一次hp,就更新
        
        vis。有金币的走一次就够了,因为走一次hp就补满了。
        #include<bits/stdc++.h>
        using namespace std;
        int dy[4]={0,1,0,-1};
        int dx[4]={-1,0,1,0};
        int vis[10][10]; 
        bool flag;
        struct point 
        {
        	int x,y,step,hp;//step是步数,hp是血量。
        };
        queue<point> q;
        int n,m,a[10][10],startx,starty,endx,endy;
        void bfs(int x,int y)
        {
        	q.push((point){x,y,0,6});
        	while(q.size()>0)
        	{
        		point now=q.front();
        		q.pop();
        		int sx=now.x,sy=now.y,ss=now.step,sh=now.hp;
        		if(a[sx][sy]==3)//到家了就直接结束
        		{
        			flag=true;
        			cout<<ss;
        			return ;
        		}
        		if(sh>1)//血量小于等于1还没到家就是死了
        		{
        			for(int i=0;i<4;i++)
        			{
        				int nx=sx+dx[i];
        				int ny=sy+dy[i];
        				if(nx>=1&&nx<=n&&ny>=1&&ny<=m)
        				{
        					if(a[nx][ny]==1||a[nx][ny]==3) //下一个是空地或者家
        					{
        						if(vis[nx][ny]<sh-1)//当前hp是sh-1大于之前的vis
        						{
        							vis[nx][ny]=sh-1;
        							q.push((point){nx,ny,ss+1,sh-1});
        						}
        					}
        					if(a[nx][ny]==4)
        					{
        						if(!vis[nx][ny])
        						{
        							vis[nx][ny]=1;
        							q.push((point){nx,ny,ss+1,6});
        						}
        					}
        				}
        			}
        		}
        	}
        }
        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) startx=i,starty=j;
        			if(a[i][j]==3) endx=i,endy=j;
        		}
        	}
        	bfs(startx,starty);
        	if(!flag) cout<<-1;
        	return 0;
        }
        • 1

        信息

        ID
        910
        时间
        1000ms
        内存
        128MiB
        难度
        2
        标签
        递交数
        67
        已通过
        39
        上传者