站外求调
  • 板块学术版
  • 楼主Ice_rnfmabj
  • 当前回复18
  • 已保存回复19
  • 发布时间2024/10/1 21:21
  • 上次更新2024/10/2 09:01:56
查看原帖
站外求调
695943
Ice_rnfmabj楼主2024/10/1 21:21

在一个 n∗m 的迷宫里,有一个小火龙被困住了,你作为一个久经码场的战士,决定去营救小火龙。地图中还会有一些守卫,你必须打败守卫才能通过守卫所在的位置,打败守卫需要花费 1 分钟,移动一步需要花费一分钟,每次你只能往上下左右某个方向移动一步。问你最少需要花费多少时间才能救到小火龙。

第一行输入两个整数n,m

接下来n行每行输入m个字符

'#'代表障碍物,无法直接通过

'.'代表空地,可以直接通过

'G'代表守卫,你需要打败他才能通过

'M'代表小火龙所在的位置

'@'表示你所在的位置

如果可以营救到小火龙,就输出最少需要花费的分钟数,

如果不可以,输出“You can't save HuoLong”。

#include <bits/stdc++.h>
using namespace std;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
int n,m,sx,sy,ex,ey,b[201][201];
bool cmp;
char a[201][201];
struct info{
    int x,y,s;
}q[40001];
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]=='@'){
                sx=i,sy=j;
            }
            if(a[i][j]=='M'){
                ex=i,ey=j;
            }
        }
    }
    int head=1,tail=1;
    q[tail].x=sx;
    q[tail].s=0;
    q[tail++].y=sy;
    b[sx][sy]=1;
    while(head<tail){
        for(int i=0;i<4;i++){
            int tx=q[head].x+dx[i];
            int ty=q[head].y+dy[i];
            if(tx<1||ty<1||tx>n||ty>m) continue;
            if(a[tx][ty]!='#'&&b[tx][ty]==0){
                b[tx][ty]=1;
                q[tail].x=tx;
                q[tail].y=ty;
                if(a[tx][ty]!='G') q[tail++].s=q[head].s+1;
                else q[tail++].s=q[head].s+2;
            }
            if(tx==ex&&ty==ey){
                cmp=1;
                break;
            }
        }
        if(cmp==1){
            cout<<q[tail-1].s<<"\n";
            return 0;
        }
        head++;
    }
    if(cmp==1) cout<<q[tail-1].s<<"\n";
    else cout<<"You can't save HuoLong";
    return 0;
}
2024/10/1 21:21
加载中...