1.题目描述:
碰到士兵多发费一秒,问到达目的地最短时间
3.解题思路:
最短时间问题都可以考虑BFS尝试,队列看要求,其实不一定要优先队列,这道题算模板题吧。
4.AC代码:
#include
#include
#include
#define N 202
using namespace std;
struct node
{
int x, y, step;
friend bool operator<(node n1, node n2)
{
return n2.step < n1.step;
}
};
int n, m, vis[N][N];
char map[N][N];
int sx, sy, x2, y2;
int dir[4][2] = { 1,0,-1,0,0,1,0,-1 };
int judge(int x, int y)
{
if (x < 0 || y < 0 || x >= n || y >= m || !vis[x][y] || map[x][y] == '#')
return 1;
return 0;
}
int bfs()
{
priority_queue Q;
node a, next;
a.x = sx;
a.y = sy;
a.step = 0;
Q.push(a);
vis[sx][sy] = 0;
while (!Q.empty())
{
a = Q.top();
Q.pop();
if (a.x == x2 && a.y == y2)
return a.step;
for (int i = 0; i < 4; i++)
{
next = a;
next.x += dir[i][0];
next.y += dir[i][1];
if (judge(next.x, next.y))//判断
continue;
next.step++;
if (map[next.x][next.y] == 'x')//卫兵处多花费了一秒
next.step++;
if (vis[next.x][next.y] >= next.step)//存入最小时间
{
vis[next.x][next.y] = next.step;
Q.push(next);
}
}
}
return 0;
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
for (int i = 0; i < n; i++)
{
scanf("%s", map[i]);
for (int j = 0; map[i][j]; j++)
{
if (map[i][j] == 'r')
{
sx = i;
sy = j;
}
else if (map[i][j] == 'a')
{
x2 = i;
y2 = j;
}
}
}
memset(vis, 1, sizeof(vis));
int ans = 0;
ans = bfs();
if (ans)
printf("%d\n", ans);
else
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
return 0;
}