题意:
找到Y点和M点到@点的距离之和最小。
解题思路:
从Y点进行一次bfs,求取所有点到Y点的距离,存储在dis[0][i][j]中;
从M点进行一次bfs,求取所有点到M点的距离,存储在dis[1][i][j]中;
最后,遍历整个图,求取所有@点的dis[0]+dis[1]的最小值。
反思:
这个题目思路很简单,但是我一直在一个地方跪了。
在初始化dis数组的时候,我开始用的是memset但是总是wa,后来改成了for循环进行初始化就ac了。
百思不得其解,希望各位小伙伴不吝赐教。
ac源代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int INF=9999999;
const int maxn=210;
int map[maxn][maxn]; //-1,0,1;
int dis[2][maxn][maxn];
struct node
{
int x,y;
}que[maxn*maxn];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int sx,sy,tx,ty;
int n,m;
char ch[maxn];
void bfs(int s,int sx,int sy) //先进来的点肯定是时间最早的点
{
int f=0,r=1;
node now;
now.x=sx,now.y=sy;
que[f]=now;
dis[s][sx][sy]=0;
while(f<r)
{
int x=que[f].x,y=que[f++].y;
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0],yy=y+dir[i][1];
if(map[xx][yy]!=-1 && dis[s][xx][yy]>dis[s][x][y]+1)
{
now.x=xx,now.y=yy;
dis[s][xx][yy]=dis[s][x][y]+1;
que[r++]=now;
}
}
}
return;
}
void solve()
{
int ans=INF;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
dis[0][i][j]=dis[1][i][j]=INF;
bfs(0,sx,sy);
bfs(1,tx,ty);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(map[i][j]==1)
{
ans=min(ans,dis[0][i][j]+dis[1][i][j]);
}
}
}
printf("%d\n",ans*11);
return;
}
int main()
{
// freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)==2)
{
memset(map,-1,sizeof(map));
for(int i=1;i<=n;i++)
{
scanf("%s",ch);
for(int j=0;j<m;j++)
{
if(ch[j]!='#') map[i][j+1]=0;
if(ch[j]=='Y')
{
sx=i,sy=j+1;
}
if(ch[j]=='M')
{
tx=i,ty=j+1;
}
if(ch[j]=='@') map[i][j+1]=1;
}
}
solve();
}
return 0;
}