ac代码 微丑
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=1010;
struct node{
int x,y;
};
node z[2],m1,g;
char s[N][N];
int mp[N][N],tm1[N][N],tg[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int n,m;
int bfs(){
queue<node>qm1,qg;
qm1.push(m1),qg.push(g);
tm1[m1.x][m1.y]=1,tg[g.x][g.y]=1;
while(qm1.size()&&qg.size()){
node tmp=qm1.front();
int time=tm1[tmp.x][tmp.y];
int uu=3; while(uu--){
int k=qm1.size(); while(k--){
node tmp=qm1.front(); qm1.pop();
if(abs(tmp.x-z[0].x)+abs(tmp.y-z[0].y)<=2*time||abs(tmp.x-z[1].x)+abs(tmp.y-z[1].y)<=2*time) continue;
for(int i=0;i<=3;i++){
int u=tmp.x+dx[i],v=tmp.y+dy[i];
if(u<0||u>=n||v<0||v>=m||mp[u][v]||tm1[u][v]) continue;
if(abs(u-z[0].x)+abs(v-z[0].y)<=2*time||abs(u-z[1].x)+abs(v-z[1].y)<=2*time) continue;
if(tg[u][v]) return time;
tm1[u][v]=time+1;
qm1.push({u,v});
}
}
}
int k=qg.size(); while(k--){
node tmp=qg.front(); qg.pop();
if(abs(tmp.x-z[0].x)+abs(tmp.y-z[0].y)<=2*time||abs(tmp.x-z[1].x)+abs(tmp.y-z[1].y)<=2*time) continue;
for(int i=0;i<=3;i++){
int u=tmp.x+dx[i],v=tmp.y+dy[i];
if(u<0||u>=n||v<0||v>=m||mp[u][v]||tg[u][v]) continue;
if(abs(u-z[0].x)+abs(v-z[0].y)<=2*time||abs(u-z[1].x)+abs(v-z[1].y)<=2*time) continue;
if(tm1[u][v]) return time;
tg[u][v]=time+1;
qg.push({u,v});
}
}
}
return -1;
}
int main(){
int t; scanf("%d",&t);
while(t--){
memset(mp,0,sizeof(mp));
memset(tm1,0,sizeof(tm1));
memset(tg,0,sizeof(tg));
int ctz=-1;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%s",s[i]);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
char c; c=s[i][j];
if(c=='X') mp[i][j]=1;
else if(c=='Z') z[++ctz]={i,j};
else if(c=='M') m1={i,j};
else if(c=='G') g={i,j};
}
}
int ans=bfs();
printf("%d\n",ans);
}
return 0;
}