E - Two Labyrinths

49 篇文章 1 订阅

一开始一直想着DFS出一个图的全部最短路径

然后for一遍 看是否有任何一条路径在另一个图上是存在的 即 if(map2[i][j]=='.')

最后超时无数次,估计是dfs这么大的图时间复杂度太高了


最终是先对图1图2 各做一次 bfs 得到最短路径长度

然后把图一图二重叠(经常碰到)  把新的图用bfs求出最短路径长度

然后如果三个长度一样则 YES, 反之则NO;


。。。坑爹   因为一个手误。。多提交了50+次,花了一天时间才找到原因

用了个二维数组的传参,就不用写三个bfs了


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue> 
#include <set>
#include <vector>
using namespace std;
struct node   
{
	int x,y;
	int time;
};     
int ans1,ans2,ans3;
node kk;
queue <node> qq; 
char map[505][505]; 
char map2[505][505];   
char map3[505][505];    
int n,m;
 int ok=0;
 int dir[][2]={0,-1, 0,1, -1,0, 1,0};         
int bfs( char f[][505])
{
	node tt;
	tt.x=1;
	tt.y=1;
	tt.time=1; 
	qq.push(tt);
	f[1][1]=1; 
	while ( !qq.empty() )
	{ 
		node point=qq.front(); 
		qq.pop(); 
		kk=point;
		if (kk.x==n&&kk.y==m)
		{
			++ok;
			if (ok==1) ans1=kk.time;
			if (ok==2) ans2=kk.time;
			if (ok==3) ans3=kk.time;
			return 0;
		} 
		for(int p=0;p<4;p++)
		{ 	
			kk=point;
			kk.x+=dir[p][0];
			kk.y+=dir[p][1];
			kk.time++;
			if(f[kk.x][kk.y]=='.') 	
			{	qq.push(kk); f[kk.x][kk.y]=1; }    //屏蔽走过的格子
		} 
		
	} 
	return 1;	 
}
int main() 
{
	
	cin>>n>>m;
	getchar();
	int i,j; 
	for (i=1;i<=n;i++) 
	{ 
		scanf("%s",map[i]+1);
			strcpy(map3[i]+1,map[i]+1);
	}
	getchar();
 
ans1=-1;
bfs( map);
getchar();
for (i=1;i<=n;i++)
{
	scanf("%s",map2[i]+1);

	getchar();
}
				
				while(!qq.empty())
				{
					qq.pop();
				}
				
			
				ans2=-2;
				
				bfs (map2 ) ;
				
				
				
				// cout<<ans2<<endl;
				
		for (i=1;i<=n;i++)
{
	for (j=1;j<=m;j++)
	{
		if(map2[i][j]=='#' ) 
			map3[i][j]='#'; 
	}
		}

			
				while(!qq.empty())
				{
					qq.pop();
				}
				
				ans3=-3;
				
				bfs (map3 ) ;
				
				//	cout<<ans3<<endl; 
				
				if (ans1==ans2&& ans1==ans3)
					printf("YES\n");
				else
					printf("NO\n");
				return 0; 
				
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值