社区讨论

第九个点 过不了 怎么办

P2802回家参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi6m49vw
此快照首次捕获于
2025/11/20 07:07
4 个月前
此快照最后确认于
2025/11/20 07:07
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int const maxn=100;
int vis[maxn][maxn];
int map[maxn][maxn];
int a[500][5];//当前位置 一维 第几步 ;二维 1:行  2:列   
int blood=6;
int dx[8]={0,-1,+1,0,0};
int dy[8]={0,0,0,-1,+1};
int mini=1000;
void dfs(int step)
{
    int x=a[step-1][1];//前一 "步" 的位置 即 当前位置 
    int y=a[step-1][2];
    //cout<<x<<" "<<y<<"    "<<blood<<endl;
    if(map[x][y] == 3 && blood>=1)
    {
         mini=min(mini,step-1);
         return ;
    }                  //到达目的地
    else 
      for(int i=1;i<=4;i++)
      {
        int xx=x+dx[i];   //下一步的位置  即 将要走的一步 
        int yy=y+dy[i];
        if(vis[xx][yy]==0 && map[xx][yy]!=0 && xx<=n && xx>=1 && yy<=m && yy>=1 && blood>=2)//当前的血量 
        {
            a[step][1]=xx;
            a[step][2]=yy;
            blood--;
            if(map[xx][yy]==4) blood=6;
            vis[xx][yy]=1;
            dfs(step+1);
            vis[xx][yy]=0;
            blood++;
        }
      }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
     {
         cin>>map[i][j];
         if(map[i][j] == 2)
         {
             a[0][1]=i;
             a[0][2]=j;
             vis[i][j]=1;
         }
     }
     //cout<<a[0][1]<<" "<<a[0][2]; 
     dfs(1);
     if(mini == 1000)
      cout<<-1;
    else
      cout<<mini;
      return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...