https://www.acwing.com/problem/content/description/179/
代码如下:
#include <bits/stdc++.h>
using namespace std;
int n,m,q,boy[100010][2],girl[100010][2],dx[4]={0,-1,1,0},dy[4]={1,0,0,-1},tim,ghostx[2],ghosty[2],startxb,startyb,startxg,startyg;
char mp[810][810];
int bfs(int a,int b,int c,int d){
int h1=0,h2=0,t1=1,t2=1;
boy[1][1]=a;boy[1][2]=b;
girl[1][1]=c;girl[1][2]=d;
while(h1<t1&&h2<t2){
tim++;
int cst1=t1,cst2=t2;
for(int i=1;i<=3;i++){
int lsh1=h1,lst1=t1;
for(int j=lsh1+1;j<=lst1;j++){
h1++;
if(abs(boy[j][1]-ghostx[0])+abs(boy[j][2]-ghosty[0])>2*tim&&abs(boy[j][1]-ghostx[1])+abs(boy[j][2]-ghosty[1])>2*tim)for(int k=0;k<4;k++){
int x=boy[j][1]+dx[k],y=boy[j][2]+dy[k];
if(x>=0&&y>=0&&x<n&&y<m&&mp[x][y]!='X'&&mp[x][y]!='b'&&abs(x-ghostx[0])+abs(y-ghosty[0])>2*tim&&abs(x-ghostx[1])+abs(y-ghosty[1])>2*tim){
t1++;
boy[t1][1]=x;boy[t1][2]=y;
mp[x][y]='b';
}
}
}
}
int lsh2=h2,lst2=t2;
for(int j=lsh2+1;j<=lst2;j++){
h2++;
if(abs(girl[j][1]-ghostx[0])+abs(girl[j][2]-ghosty[0])>2*tim&&abs(girl[j][1]-ghostx[1])+abs(girl[j][2]-ghosty[1])>2*tim)for(int k=0;k<4;k++){
int x=girl[j][1]+dx[k],y=girl[j][2]+dy[k];
if(x>=0&&y>=0&&x<n&&y<m&&mp[x][y]!='X'&&mp[x][y]!='g'&&abs(x-ghostx[0])+abs(y-ghosty[0])>2*tim&&abs(x-ghostx[1])+abs(y-ghosty[1])>2*tim){
t2++;
girl[t2][1]=x;girl[t2][2]=y;
mp[x][y]='g';
}
}
}
for(int i=cst1;i<=t1;i++)for(int j=cst2;j<=t2;j++)if(boy[i][1]==girl[j][1]&&boy[i][2]==girl[i][2])return tim;
}
return -1;
}
int main(){
int tot;cin>>tot;
for(int i=1;i<=tot;i++){
cin>>n>>m;
for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>mp[i][j];
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
if(mp[i][j]=='M'){
startxb=i;startyb=j;
mp[i][j]='b';
}
if(mp[i][j]=='M'){
startxg=i;startyg=j;
mp[i][j]='g';
}
if(mp[i][j]=='M'){
ghostx[q]=i,ghosty[q]=j;q++;
}
}
cout<<bfs(startxb,startyb,startxg,startyg)<<endl;
}
return 0;
}
具体思路是根据秒数拓展,男生拓展三层,女生拓展一层,但不知道为什么只输出-1?