在一个 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;
}