一开始一直想着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;
}