HDU1242-Rescue

Rescue
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16313    Accepted Submission(s): 5925

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
 

Author
CHEN, Xue
 

Source
ZOJ Monthly, October 2003
 

 

题意:
救人,你在r,要救的人在a,'.'是路可以走,'#'是墙,'x'是警卫,走路花费一步,遇见警卫花费两步。
问最小多少步能救人,能的话输出步数,不能的话输出"Poor ANGEL has to stay in the prison all his life."

思路:
搜索题,果断用BFS,要注意的是,深搜回溯太多,效率不高,而简单广搜,入队后每次出队时,根据地
图情况的不同,出队元素所记忆的时间并不是层次递增的,需要全部搜索才能找到正确答案。可以
根据时间进行优先性选择,每次都要出队当前队列中步数最少的出队,而入队处理时,正常处理即可,出队顺序由优先队列自动排序(小记录在前)。这样,我们就可以从“a”进行基于优先队列的范围搜索了,并且在第一
次抵达有朋友的位置时得到正确结果

AC代码:

#include<stdio.h>
#include<string.h>
#include<functional>
#include<queue>
using namespace std;
char a[210][210];
int flag[210][210];
int next[4][2]={
  {-1,0},
  {1,0},
  {0,-1},
  {0,1}
};
int n,m;
struct node
{
   int x,y;
   int step;
   bool operator < (const node &a) const {
        return step>a.step;//最小值优先
    }  

};
void BFS(int x,int y)
{
   priority_queue<node>q;
   node q1,q2;
   int i;
   flag[x][y]=1;
   q1.x=x;q1.y=y;
   q1.step=0;
   q.push(q1);
   while(!q.empty())
   {
      q1=q.top();
      q.pop();
      for(i=0;i<4;i++)
      {
         q2.x=q1.x+next[i][0];
         q2.y=q1.y+next[i][1];
         q2.step=q1.step;
         if(a[q2.x][q2.y]!='#'&&q2.x>=0&&q2.y>=0&&q2.x<n&&q2.y<m)
         {
            if(a[q2.x][q2.y]=='.'&&flag[q2.x][q2.y]==0)
            {
               flag[q2.x][q2.y]=1;
               q2.step+=1;
               q.push(q2);
               continue;
            }

            if(a[q2.x][q2.y]=='x'&&flag[q2.x][q2.y]==0)
            {
               flag[q2.x][q2.y]=1;
               q2.step+=2;
               q.push(q2);
               continue;
            }

            if(a[q2.x][q2.y]=='a')
            {
                printf("%d\n",q2.step+1);
                return;
            }
         }
      }
   }
   printf("Poor ANGEL has to stay in the prison all his life.\n");
}
int main()
{
    int i,j,x,y;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
       memset(a,0,sizeof(a));
       for(i=0;i<n;i++)
       {
          getchar();
          for(j=0;j<m;j++)
          {
             scanf("%c",&a[i][j]);
             if(a[i][j]=='r')
             {
                x=i;y=j;
             }
          }
       }
       memset(flag,0,sizeof(flag));
       BFS(x,y);
    }
    return 0;
}
时间: 2024-12-10 22:27:01

HDU1242-Rescue的相关文章

windows 8和Ubuntu 12.04双系统启动时出现grub rescue

由于在Windows下面对分区修改(我是删除分区造成),导致grub所在分区由sda3变成了sda2了,这样一来找不到grub了,Ubuntu开机就出现了: grub rescue > 在此情况下,可以如下解决,并不用重新安装系统 第一步,找出你的Linux盘在那个分区以及grub目录在什么位置. 如果你还记得最好,忘了也无所谓,使用下面命令逐个试探即可: grub rescue>ls 回车后,ls命令会列出所有磁盘分区信息,如: hd0, (hd0,msdos7),(hd0,msdos8),

电脑开机出现error:no such partition grub rescue

一.问题出现描述 1. 台式电脑上现有系统为xp和ubuntu11.10,打算安装win7,以前分区不理想,想重新分区. 2. 把ubuntu11.10所在的分区完全格式化后, 重新启动,电脑黒屏.在屏幕上显示 error: no such partition grub rescue> 二.问题解决方法 1. 下载有效的winPE:WinPE启动U盘工具箱WinPEU.rar 功能说明:通用PE工具箱是一款极适合于网管.装机人员使用的多功能WinPE系统维护工具箱,支持win7,支持SATA硬盘

ruby异常处理:rescue

一个运行着的程序常会遇到意外的问题.一个要读取的文件不存在;当希望存入一些数据时磁盘满了;用 户可能输入不恰当的数据. ruby> file = open("some_file") ERR: (eval):1:in `open': No such file or directory - some_file 一个健壮的程序会合理并漂亮的处理这些问题.面对那些异常是一件讨人厌的工作.C程序员被要求做到 检查每一个可能导致错误发生的系统调用的返回值并立刻做出决定. FILE *file

Ubuntu重装启动失败进入修复grub rescue模式

  因为把Ubuntu从13.04升级到13.10后,鼠标出现了问题,一打开网页就不停的闪,而且好多东西都不一样了,又不好用,所以选择重装系统,重装的时候偏偏又重新分了区,然后装完了,一重启,悲剧了,进入修复grub rescue模式下了,一时间就不知道怎么办好了,好在还有个平板可以上网,马上上网搜.很快就搜到不少,点开第一个,"用U盘启动进入Windows系统重写mbr"?那我的Ubuntu不就没了!!!直接PASS!!!"直接在grub rescue"下修复,嗯

NouvaLinux Backup and Rescue 11.08.1d发布 备份和系统恢复工具

NouvaLinux Backup and Rescue 是一个用于 live CD 的备份和系统恢复工具.该工具是由RyXéo(一个免费软件)的partclone界面组成,兼容Clonezilla的备份. NouvaLinux Backup and Rescue 11.08.1d该版本的主要工具已经完全翻译成英文版(以前版本仅支持法语). 软件信息:http://nouvalinux.org/backups/ 下载地址: http://nouvalinux.org/wp-content/plu

NouvaLinux Backup and Rescue 11.08.1c发布 备份和系统恢复工具

NouvaLinux Backup and Rescue 是一个用于 live CD 的备份和系统恢复工具.该工具是由RyXéo(一个免费软件)的partclone界面组成,兼容Clonezilla的备份. NouvaLinux Backup and Rescue 11.08.1c该版本修复了一些系统恢复的错误和分区表. 软件信息:http://nouvalinux.org/nouvalinux-rescue-cd/ 下载地址: Ryxeo-nouvalinux-rescue-cd- i386-

ubuntu引导出错:grub rescue解决办法

修改了win8.1的启动项导致Ubuntu引导出错: GRUB loading error:unknow filesystem grub rescue> [造成该问题的原因] 1.直接在window下格式化ubuntu的分区 2.调整磁盘 利用工具合并 修改 删除分区 是磁盘分区数目发生变化 3.重装系统选择不同分区  格式化之前分区 4.恢复到老版本系统 [解决办法] 1. 先使用ls命令,找到Ubuntu的安装在哪个分区: 在 grub rescue>下输入以下命令:先输入ls,会罗列所有

Ubuntu Rescue Remix v11.04发布 GNU/Linux系统

Ubuntu Rescue Remix是可以从光盘或USB闪存设备自启动运行的GNU/Linux系统.它提供了带有命令行界面环境的数据恢复专家软件,这集成了一些最优秀的免费和开放源码数据恢复及计算机取证工具. Version 11.04 (Natty Narwhal) of the very best Free-Libre Open-Source data recovery software toolkit based on http://www.aliyun.com/zixun/aggrega

Nova Suspend/Rescue 操作详解 - 每天5分钟玩转 OpenStack(35)

本节我们讨论 Suspend/Resume 和 Rescue/Unrescue 这两组操作. Suspend/Resume 有时需要长时间暂停 instance,可以通过 Suspend 操作将 instance 的状态保存到宿主机的磁盘上.当需要恢复的时候,执行 Resume 操作,从磁盘读回 instance 的状态,使之继续运行. 这里需要对 Suspend 和 Pause 操作做个比较: 相同点两者都是暂停 instance 的运行,并保存当前状态,之后可以通过 Resume 操作恢复

poj 1122 FDNY to the Rescue! 最短路

   注意 路径有权值为0的-- /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue&g