Escape from the nightmare (bfs)

Escape the nightmare

Insert picture description here
Insert picture description here

Problem solving ideas

Two-way bfs
set up two queues
, one boy, one girl,
start bfs at the same time,
and then pay attention to judge that the ghost can't be reached.
If the boy and girl will get together,
the current round is the shortest time

AC code

#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int o,n,m,tot,head1,tail1,head2,tail2,pxm[640005],pym[640005],pxg[640005],pyg[640005],pxz[5],pyz[5],c[805][805];
char a[805][805];
int dx[4]={
    
    0,0,1,-1};
int dy[4]={
    
    1,-1,0,0};
inline int read()//快读
{
    
    
	int x = 0, f = 1; char s = getchar();
	while (s < '0' || s > '9') {
    
     if (s == '-') f = -f; s = getchar(); }
	while (s >= '0' && s <= '9') {
    
     x = x * 10 + s - '0'; s = getchar(); }
	return x * f;
}
bool check(int x,int y,int z)//判断
{
    
    
	if(x<1||x>n||y<1||y>m)return false;//出界
	if(a[x][y]=='X')return false;//墙
	for(int i=1;i<=tot;i++)//鬼到不到的了
	 if(abs(x-pxz[i])+abs(y-pyz[i])<=2*z)return false;
	return true;
}
void bfs()
{
    
    
	while(head1<tail1&&head2<tail2)
	{
    
    
		o++;
		for(int times=1;times<=3;times++)//3次(男孩)
		{
    
    
			int end=tail1;
			while(head1<end)
			{
    
    
				head1++;
				if(!check(pxm[head1],pym[head1],o))continue;
				for(int i=0;i<4;i++)
				{
    
    
					int xx=pxm[head1]+dx[i],yy=pym[head1]+dy[i];
					if(check(xx,yy,o))
					 if(c[xx][yy]!=1)
					 {
    
    
					 	if(c[xx][yy]==2){
    
    printf("%d\n",o);return;}//会和就输出
					 	c[xx][yy]=1;
					 	pxm[++tail1]=xx;pym[tail1]=yy;
					 }
				}
			}
		}
		int end=tail2;//一次(女孩)
		while(head2<end)
		{
    
    
			head2++;
			if(!check(pxg[head2],pyg[head2],o))continue;
			for(int i=0;i<4;i++)
			{
    
    
				int xx=pxg[head2]+dx[i],yy=pyg[head2]+dy[i];
				if(check(xx,yy,o))
				 if(c[xx][yy]!=2)
				 {
    
    
				 	if(c[xx][yy]==1){
    
    printf("%d\n",o);return;}//会和就输出
				 	c[xx][yy]=2;
				 	pxg[++tail2]=xx;pyg[tail2]=yy;
				 }
			}
		}
	}
	printf("-1\n");
	return;
}
int main()
{
    
    
	int T;
	T=read();
	while(T--) 
	{
    
    
		o=tot=head1=tail1=head2=tail2=0;//初值
		memset(c,0,sizeof(c));
		n=read();
		m=read();
		for(int i=1;i<=n;i++)//输入
	 	 for(int j=1;j<=m;j++)
	 	 {
    
    
	 		a[i][j]=getchar();
	 		while(a[i][j]!='.'&&a[i][j]!='X'&&a[i][j]!='Z'&&a[i][j]!='G'&&a[i][j]!='M')
	 	 	 a[i][j]=getchar();
	 		if(a[i][j]=='M'){
    
    pxm[++tail1]=i;pym[tail1]=j;c[i][j]=1;}
	 		if(a[i][j]=='G'){
    
    pxg[++tail2]=i;pyg[tail2]=j;c[i][j]=2;}
	 		if(a[i][j]=='Z'){
    
    pxz[++tot]=i;pyz[tot]=j;}
	 	 }
		bfs();
	}
	return 0;
}

Thank you

Guess you like

Origin blog.csdn.net/weixin_45524309/article/details/113057718