`

hdu 1242 Rescue(优先队列)

    博客分类:
  • bfs
阅读更多

Rescue

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5846    Accepted Submission(s): 2168

Problem Description
Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison.

Angel's friends want to save Angel. Their task is: approach Angel. We assume that "approach Angel" is to get to the position where Angel stays. When there's a guard in the grid, we must kill him (or her?) to move into the grid. We assume that we moving up, down, right, left takes us 1 unit time, and killing a guard takes 1 unit time, too. And we are strong enough to kill all the guards.

You have to calculate the minimal time to approach Angel. (We can move only UP, DOWN, LEFT and RIGHT, to the neighbor grid within bound, of course.)

 

Input
First line contains two integers stand for N and M.

Then N lines follows, every line has M characters. "." stands for road, "a" stands for Angel, and "r" stands for each of Angel's friend.

Process to the end of the file.

 

Output
For each test case, your program should output a single integer, standing for the minimal time needed. If such a number does no exist, you should output a line containing "Poor ANGEL has to stay in the prison all his life."

 

Sample Input
7 8 #.#####. #.a#..r. #..#x... ..#..#.# #...##.. .#...... ........

 

Sample Output
13
      这题要用到优先队列来进行广搜bfs,不然会出现时间长的先到达,这题是我第一次用优先队列,看看哈。
代码:
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;

int xx[4] = {1, -1, 0, 0};
int yy[4] = {0, 0, 1, -1};

int map[205][205];
char a[205][205];
int N, M, x1, y1, x2, y2;
bool flag;

struct node
{
    friend bool operator < (node a, node b) //优先步数少的
    {
        return a.step > b.step;
    }
    int x, y, step;
}n, m;

int main()
{
    int i, j;
    while(scanf("%d %d", &N, &M) != EOF)
    {
        for(i = 0; i < N; i++)
        {
            getchar();
            for(j = 0; j < M; j++)
            {
                scanf("%c", &a[i][j]);
                map[i][j] = 10000000;   //初始化
                if(a[i][j] == 'r')
                    x1 = i, y1 = j;
                if(a[i][j] == 'a')
                    x2 = i, y2 =j;
            }
        }
        flag = false;
        n.x = x1; n.y = y1; n.step = 0;
        priority_queue<node> Q;     //建立优先队列
        Q.push(n);
        while(!Q.empty())
        {
            m = Q.top();
            Q.pop();
            if(m.x == x2 && m.y == y2)  //到达目标
            {
                flag = true;
                break;
            }
            for(i = 0; i < 4; i++)
            {
                n.x = m.x + xx[i];
                n.y = m.y + yy[i];
                if(n.x>=0 && n.x<N && n.y>=0 && n.y<M && a[n.x][n.y]!='#')
                {
                    if(a[n.x][n.y] == 'x') n.step = m.step + 2; //遇到X时间加2
                    else n.step = m.step + 1;   //否则正常加1
                    if(n.step >= map[n.x][n.y]) continue;
                    map[n.x][n.y] = n.step;
                    Q.push(n);
                }
            }
        }
        if(flag) printf("%d\n", m.step);
        else printf("Poor ANGEL has to stay in the prison all his life.\n");
    }

    return 0;
}
 
分享到:
评论
1 楼 sgeteternal 2011-08-03  
good!

相关推荐

    hdu.rar_hdu

    1. **基础算法**:如排序(冒泡、选择、插入、快速、归并等)、搜索(线性、二分、深度优先、广度优先等)。 2. **高级算法**:包括动态规划(状态转移、记忆化搜索)、贪心策略、回溯法、分支限界法等。 3. **...

    HDU题目java实现

    8. **图论与树**:HDU题目中可能涉及图的遍历(深度优先搜索DFS、广度优先搜索BFS)、树的遍历(前序、中序、后序)以及最小生成树、最短路径等算法。 9. **动态规划**:这是一种优化策略,通过构建状态转移方程来...

    Dijkstra算法解HDU1874

    算法使用一个优先队列(通常是二叉堆)来存储待处理的节点,每次取出距离源节点最近的节点,并检查其邻接节点,如果通过当前节点到达邻接节点的距离比已知的路径更短,就更新这个最短距离。 以下是Dijkstra算法的...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    hdu_acm_1084.rar_ACM_HDU10_acm10_hdu_hdu 1084

    2. **数据结构**:链表、树、栈、队列、哈希表、优先队列等可能被用来高效地处理问题。 3. **复杂度分析**:为了通过ACM的评测,解决方案需要考虑时间复杂度和空间复杂度,以确保在限制时间内完成计算。 4. **C++...

    杭电ACMhdu1163

    1. **算法基础**:解决ACM题目,首先需要掌握基础的算法,如排序(快速排序、归并排序、冒泡排序等)、搜索(二分查找、深度优先搜索、广度优先搜索等)和动态规划。 2. **数据结构**:常用的数据结构包括数组、...

    ACM HDU

    【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...

    hdu1250高精度加法

    ### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...

    HDU最全ac代码

    1. **基础算法**:包括排序算法(快速排序、归并排序、堆排序等)、搜索算法(深度优先搜索、广度优先搜索、A*搜索等)、图论算法(最短路径、最小生成树、拓扑排序等)和动态规划等。 2. **数据结构**:如链表、...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    HDU1059的代码

    HDU1059的代码

    hdu-acm源代码(上百道源代码)

    例如,"zscas060102"可能是一道关于计算几何或图论的题目,源代码可能会涉及到线段树、优先队列等高级数据结构,以及动态规划或回溯搜索等算法。"yfndq2"可能是一个字符串处理或模式匹配的问题,可能用到了KMP、...

    hdu1001解题报告

    hdu1001解题报告

    hdu.zip_ACM_hdu

    常见的数据结构包括数组、链表、栈、队列、树(二叉树、平衡树、堆等)、图等。这些数据结构各有特点,适用于不同的问题场景。例如,数组提供了随机访问的优势,但插入和删除操作可能效率较低;链表则在插入和删除时...

    hdu 1574 passed sorce

    hdu 1574 passed sorce

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    Hdu1000—2169部分代码

    2. **搜索算法**:深度优先搜索(DFS)、广度优先搜索(BFS)、二分查找等。 3. **动态规划**:解决具有重叠子问题和最优子结构的问题。 4. **图论算法**:最短路径算法(Dijkstra、Floyd-Warshall)、拓扑排序、...

    HDU acm-PPT课件

    数据结构是ACM竞赛中的核心部分,包括数组、链表、栈、队列、树(二叉树、平衡树如AVL和红黑树)、图(图的遍历、最短路径等)等。熟练掌握这些数据结构的实现与操作,能帮助解决复杂问题。例如,二分查找可以快速...

Global site tag (gtag.js) - Google Analytics