题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242
方法:采用优先队列对到达监狱的每个位置的时间进行从小到大排序。
代码:
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
struct node
{
int x, y, time;
// bool operator < (struct node a) const
// {
// return time > a.time;//按time从小到大
// }
}start, end;
struct cmp
{
bool operator () (node &a, node &b)
{
return a.time>b.time;//按从小到大
}
};
bool operator < (struct node a, struct node b)
{
return a.time > b.time;//按time从小到大
}
char map[202][202];
int a[202][202], N, M, dir[] = {-1, 0, 1, 0, 0, -1, 0, 1};
int bfs(struct node st)
{
// priority_queue<node> pq;
priority_queue<node, vector<node>, cmp> pq;
pq.push(st);
while (!pq.empty())
{
struct node cur = pq.top();
pq.pop();
for (int i=0; i<4; ++i)
{
struct node temp;
temp.x = cur.x + dir[2*i];
temp.y = cur.y + dir[2*i+1];
temp.time = cur.time + 1;
if (temp.x>=0 && temp.x<N && temp.y>=0 && temp.y<M && map[temp.x][temp.y]!='#')
{
if (a[temp.x][temp.y]!=-1)
continue;
if (map[temp.x][temp.y]=='a')
return temp.time;
if (map[temp.x][temp.y]=='.')
{
a[temp.x][temp.y] = temp.time;
pq.push(temp);
}
else if (map[temp.x][temp.y]=='x')
{
++ temp.time;
a[temp.x][temp.y] = temp.time;
pq.push(temp);
}
}
}
}
return -1;
}
int main()
{
while (~scanf("%d%d", &N, &M))
{
getchar();
for (int i=0; i<N; i++)
{
gets(map[i]);
for (int j=0; j<M; j++)
if (map[i][j]=='r')
{
start.x = i;
start.y = j;
start.time = 0;
}
else if (map[i][j]=='a')
{
end.x = i;
end.y = j;
}
}
memset(a, -1, sizeof(a));
a[start.x][start.y] = 0;
int time = bfs(start);
if (time==-1)
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n", time);
}
return 0;
}