双向广搜算法题求调
  • 板块学术版
  • 楼主hair_loss_tree
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/30 21:35
  • 上次更新2023/12/1 13:00:51
查看原帖
双向广搜算法题求调
1057595
hair_loss_tree楼主2023/11/30 21:35

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?

2023/11/30 21:35
加载中...