hdu 1242 Rescue 优先队列

题目链接: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值