Problem ID:1012 Rescue

简单题意:给出一个地图,其中有一个"a",代表angle,若干个"r",代表去营救angle的朋友,"x"标志敌人,"."标志可以行进的区域,"#"标志不可行进的区域。只可直行,不能斜向前进。走向"."耗时1,走向并击败"x"耗时2,求能拯救angle所需要的最短时间。如不能拯救,则输出"Poor ANGEL has to stay in the prison all his life."

解题思路形成过程:利用BFS,但所有能经过的区域都要搜索一遍(这是重点),因为"."区域和"x"区域耗时不同。

用一个二维数组记录能到达每个区域的最短时间。

在遍历过程中,如果按照某走法将要到达的某区域的所花费的总时间比之前记录的要大,则不走,从而进行剪枝。

感想:因为是所有"."和"x"区域都要遍历一遍,用DFS也可以。一开始没有考虑到这个条件,WA了一次,还是考虑的不够细致。

代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int cmap[201][201],mark[201][201];
int r1[201],r2[201];
int dir[4][2]={{-1,0},{0,-1},{0,1},{1,0}};
int aim_r,aim_c;
int n,m;
void bfs(int r,int c)
{queue<int>s;s.push(r);s.push(c);s.push(0);mark[r][c]=0;while(!s.empty()){int now_r=s.front();s.pop();int now_c=s.front();s.pop();int now_cnt=s.front();s.pop();for(int i=0;i<4;++i){int temp_r=now_r;int temp_c=now_c;int temp_cnt=now_cnt;temp_r+=dir[i][0];temp_c+=dir[i][1];if(cmap[temp_r][temp_c]==3)temp_cnt+=2;elsetemp_cnt++;if(temp_r>=0&&temp_r<n&&temp_c>=0&&temp_c<m)if(cmap[temp_r][temp_c]!=1&&cmap[temp_r][temp_c]!=5)if(mark[temp_r][temp_c]>temp_cnt||mark[temp_r][temp_c]==-1)//所有"."和"x"区域必须全部搜索一遍.{s.push(temp_r);s.push(temp_c);s.push(temp_cnt);mark[temp_r][temp_c]=temp_cnt;}}}
}
int main()
{// freopen("2.txt","r",stdin);while(scanf("%d%d",&n,&m)!=EOF){memset(mark,-1,sizeof(mark));int t=0;for(int i=0;i<n;++i)for(int j=0;j<m;++j){char temp;cin>>temp;if(temp=='r'){cmap[i][j]=1;r1[t]=i;r2[t]=j;++t;}else if(temp=='a'){cmap[i][j]=2;aim_r=i;aim_c=j;}else if(temp=='x')cmap[i][j]=3;else if(temp=='.')        //可不写cmap[i][j]=4;else if(temp=='#')cmap[i][j]=5;}for(int i=0;i<t;++i)bfs(r1[i],r2[i]);int cmin=mark[aim_r][aim_c];if(cmin!=-1)printf("%d\n",cmin);elseprintf("Poor ANGEL has to stay in the prison all his life.\n");}
}

BFS 搜索 Problem 1012 Rescue 拯救天使相关推荐

  1. 【CCCC】L3-008 喊山 (30分),BFS搜索最长路,水题

    problem L3-008 喊山 (30分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中 ...

  2. hiho_1139_二分+bfs搜索

    题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值.  题目链接:二分      最小化最大值,考虑采用二分搜索.对所有的边 ...

  3. java灌水bfs二叉树,二叉树的BFS搜索

    本人需要阅读代码,如果觉得阅读困难可以一步到CSDN 代码中涉及到的通过先序遍历和中序遍历生成一条二叉树的算法,在本人的另一篇博客通过树的中序和先序遍历生成二叉树中进行了详细讲解. 广度优先搜索算法( ...

  4. 4. 对称飞行器 -- BFS搜索

    对称飞行器 小强在玩一个走迷宫的游戏,他操控的人物现在位于迷宫的起点,他的目标是尽快的到达终点. 每一次他可以选择花费一个时间单位向上或向下或向左或向右走一格,或是使用自己的对称飞行器花费一个时间单位 ...

  5. 拯救天使 (BFS)

    题目: 1242 Rescue 1 //这是一个比较标准的bfs,没有经过任何优化,但是思路比较清晰,容易看懂. 2 #include <iostream> 3 #include < ...

  6. 魔法数字 problem Bfs搜索

    大家都很强, 可与之共勉. 魔法数字 (A.pas/.c/.cpp) 时间限制:1.0s,空间限制131072 KB 题目描述: 给一个六位数A 和另外一个六位数B. 你有一根魔法棒,初始时指向A 的 ...

  7. HDU - 2612 Find a way(BFS搜索)

    题目: 链接 思路: 用BFS分别以'Y'和'M'的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到'@'更行最小值. PS: 如果用'Y'和'M'点分别去搜每个 ...

  8. ACM之八数码问题----BFS搜索----数独游戏的模拟(下)

    题目描述;数独游戏的内核代码 八数码问题; 编号为1到8的8个正方形滑块被摆成3行3列;(有一个格子留空); 每次可以把与空格相邻的滑块(有公共边才算相邻)移到空格中; 而它原来的位置就成为了新的空格 ...

  9. 魔戒 4维bfs搜索

    魔戒 Problem Description 蓝色空间号和万有引力号进入了四维水洼,发现了四维物体–魔戒. 这里我们把飞船和魔戒都抽象为四维空间中的一个点,分别标为 "S" 和 & ...

最新文章

  1. GROMACS运行参数整理(一)
  2. redis在容器里连接不上_Redis服务器被劫持风波,服务器相关知识共享学习
  3. SQL2005对字符串进行MD5加密
  4. sqlbulkcopy是覆盖式更新吗_React 328道最全面试题(持续更新)
  5. 脑机接口与量子计算机,关于脑机接口---浅谈人工智能。
  6. android分辨率对应关系,android各dpi与分辨率的对应关系
  7. VMware虚拟机中CentOS网络设置
  8. 哈工大-操作系统的引导
  9. Php-SPL库中的迭代器类详解
  10. 【MATLAB航空航天工具箱】学习笔记--闰秒
  11. VIM复制指令yank
  12. java计算机毕业设计基于Web的上门家教系统的设计与实现源码+数据库+系统+lw文档+mybatis+运行部署
  13. Visual Studio开发环境介绍 及控件属性、事件
  14. 如何提高深度学习的泛化能力?
  15. 带你掌握最常用的数据分析图表
  16. python处理excel表格中合并的行
  17. oracle 通信通道异常,(oracle)ORA-03113: 通信通道的文件结尾错误处理
  18. oracle实体视图日志,Oracle案例02——ORA-12034: SCOTT.USER_TABLE 上的实体化视图日志比上次刷新后的内容新...
  19. jQuery 删除表格中选中的行
  20. 宇视IPC9312I-FW通道2无录像

热门文章

  1. linux 不支持添加 ppa,Ubuntu下如何添加ppa仓库
  2. 启动vm虚拟机里的系统时,提示此主机支持 AMD-V,但 AMD-V 处于禁用状态
  3. 通过命令查看linux 密码,linux查看用户密码(linux查看用户密码命令)
  4. 你还有这些JS问题需要掌握
  5. IDEA移动一行快捷键
  6. TEX Quotes , UVa272
  7. 嵌入式操作系统漫议:操作系统or裸跑?
  8. 数据库隔离装置mysql_Oracle/Mysq数据库隔离级别设置
  9. 大数据的关键思考系列27:大数据与娱乐业
  10. linux logo 的启动方式