HDU1242 BFS
题意
给一个二维坐标的图,给出起点a和多个终点r,还给出一些特殊的块,经过这些块需要花费两步。求最短距离。
解法
广搜。有两种解法,一是遍历完整个图,记录最短的距离。二是用优先队列。遇到终点直接返回。这里我用前一种。这里用dx,dy两个数组表示行进的四个方向。易于阅读。
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int n,m,cnt;
char g[
205][
205];
bool vis[
205][
205];
int dx[] = {
0,
0,-
1,
1};
int dy[] = {
1,-
1,
0,
0};
struct node{
int x,y,step;
node(
int a,
int b,
int c){x=a,y=b,step=c;}
};
queue<node> q;
void init()
{
cnt =
0;
memset(vis,
false,
sizeof(vis));
while(!q.empty())
q.pop();
}
void input()
{
for(
int i=
0;i<n;i++)
scanf(
"%s",g[i]);
}
bool ok(node N)
{
int x = N.x;
int y = N.y;
if(x<m && x>=
0 && y<n && y>=
0)
if(!vis[y][x])
if(g[y][x] !=
'#')
return true;
return false;
}
node getAngel()
{
for(
int i=
0;i<n;i++)
for(
int j=
0;j<m;j++)
if(g[i][j] ==
'a')
return node(j,i,
0);
}
void bfs()
{
node Angel = getAngel();
vis[Angel.y][Angel.x] =
true;
q.push(Angel);
while(!q.empty())
{
node now = q.front();q.pop();
if(g[now.y][now.x] ==
'r')
cnt = max(cnt,now.step);
for(
int i=
0;i<
4;i++)
{
node next = node(now.x+dx[i], now.y+dy[i], now.step+
1);
if(g[next.y][next.x] ==
'x')
next.step++;
if(ok(next))
{
vis[next.y][next.x] =
true;
q.push(next);
}
}
}
}
int main()
{
while(~
scanf(
"%d%d",&n,&m))
{
init();
input();
bfs();
if(cnt)
printf(
"%d\n",cnt);
else printf(
"Poor ANGEL has to stay in the prison all his life.\n");
}
}