bfs题,拿来练练手,多敲敲,bfs别忘了啊。
要注意队列,front ,rear加的先后顺序。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define sf scanf
#define pf printf
#define gc getchar
using namespace std;
char G[21][21];
bool vis[21][21];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
int m,n,dis[500];
typedef struct node
{
int x,y;
}po;
po a,b,c,Q[500];
int bfs(po st)
{
int i,j,fr=1,re=2;
po now,tmp;
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
Q[1]=st;
vis[st.x][st.y]=1;
while(fr<re)
{
now=Q[fr];
if(G[now.x][now.y]=='h') return fr;
for(i=0;i<4;i++)
{
tmp.x=now.x+dx[i],tmp.y=now.y+dy[i];
if(tmp.x>=1&&tmp.x<=m&&tmp.y>=1&&tmp.y<=n)
{
if(!vis[tmp.x][tmp.y]&&G[tmp.x][tmp.y]!='#'&&G[tmp.x][tmp.y]!='m')
{
vis[tmp.x][tmp.y]=1;
dis[re]=dis[fr]+1;//注意先处理,然后加re
Q[re]=tmp,re++;
}
}
}
fr++;
}
return 0;
}
int main()
{
int T,ca=0,i,j;
sf("%d",&T);
while(T--)
{
sf("%d%d",&m,&n);
gc();
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
sf("%c",&G[i][j]);
if(G[i][j]=='a') a.x=i,a.y=j;
else if(G[i][j]=='b') b.x=i,b.y=j;
else if(G[i][j]=='c') c.x=i,c.y=j;
else continue;
}
gc();
}
int c_t,a_t,b_t;
a_t=dis[bfs(a)];
b_t=dis[bfs(b)];
c_t=dis[bfs(c)];
pf("Case %d: %d\n",++ca,max(max(a_t,b_t),c_t));
}
return 0;
}