您的位置:首页 > 其它

【蓝桥杯-bfs】找钥匙回家

2018-02-27 21:50 309 查看


#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#include<queue>

int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
struct point
{
int x,y;
point(int xx,int yy)
{
x=xx;
y=yy;
}
};
queue<point> q1;
queue<point> q2;
static int n,m;
int visit1[2010][2010];
int visit2[2010][2010];
int step1[2010][2010];
int step2[2010][2010];
char b[2010][2010];

void bfs1(int sx,int sy)
{
q1.push(point(sx,sy));
visit1[sx][sy]=1;
while(q1.empty()!=true)
{
point a=q1.front();
q1.pop();
for(int i=0;i<4;i++)
{
int xxx=a.x+xx[i];
int yyy=a.y+yy[i];
if(xxx<0 || yyy<0 || xxx>n-1 || yyy>m-1 || b[xxx][yyy]=='#' ||visit1[xxx][yyy]==1)
continue;
visit1[xxx][yyy]=1;
q1.push(point(xxx,yyy));
step1[xxx][yyy]=step1[a.x][a.y]+1; //最重要,bfs第一次走到的即最短路
}
}
}

void bfs2(int tx,int ty)
{
q2.push(point(tx,ty));
visit2[tx][ty]=1;
while(q2.empty()!=true)
{
point a=q2.front();
q2.pop();
for(int i=0;i<4;i++)
{
int xxx=a.x+xx[i];
int yyy=a.y+yy[i];
if(xxx<0 || yyy<0 || xxx>n-1 || yyy>m-1 || b[xxx][yyy]=='#' ||visit2[xxx][yyy]==1)
continue;
visit2[xxx][yyy]=1;
q2.push(point(xxx,yyy));
step2[xxx][yyy]=step2[a.x][a.y]+1; //最重要,bfs第一次走到的即最短路
}
}
}

int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cin>>b[i][j];
}
memset(visit1,0,sizeof(visit1));
memset(visit2,0,sizeof(visit2));
memset(step1,0,sizeof(step1));
memset(step2,0,sizeof(step2));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(b[i][j]=='S')
bfs1(i,j);
if(b[i][j]=='T')
bfs2(i,j);
}
}
int minn=1e10;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(b[i][j]=='P' && visit1[i][j]==1 && visit2[i][j]==1)
{
if(minn>step1[i][j]+step2[i][j])
minn=step1[i][j]+step2[i][j];
}
}
}
cout<<minn;
return 0;
}思路就是分别从S和T进行两次全体bfs,最后枚举每个P,找到和是最少的那个。
附上修改前的错误:


1:数组大小不对。

2:minn 初始化为正无穷,你的太小了

3:他们可能会到达不了,step1[i][j] 中的某个点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: