BFS HDOJ 1242 Rescue
题意:从r走到a,遇到x多走一步,问最小走到a的步数
分析:因为r有多个,反过来想从a走到某个r的最小步数,简单的BFS。我对这题有特殊的感情,去年刚来集训队时肉鸽推荐了这题,当时什么都不会,看个数组模拟队列的BFS看的头晕,现在看起来也不过如此,额,当年开始是从r走到a的,因为数据巨弱才过的,应该要用到优先队列。
/************************************************
* Author :Running_Time
* Created Time :2015/9/25 星期五 09:13:51
* File Name :B_BFS.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 2e2 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
struct Angle {
int x, y, step;
Angle () {}
Angle (int x, int y, int step) : x (x), y (y), step (step) {}
};
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
bool vis[N][N];
char maze[N][N];
int n, m; bool judge(int x, int y) {
if (x < 1 || x > n || y < 1 || y > m || vis[x][y] || maze[x][y] == '#') return false;
else return true;
} void BFS(Angle s) {
int ret = INF;
memset (vis, false, sizeof (vis));
queue<Angle> Q; Q.push (s);
vis[s.x][s.y] = true;
while (!Q.empty ()) {
Angle r = Q.front (); Q.pop ();
for (int i=0; i<4; ++i) {
int tx = r.x + dx[i];
int ty = r.y + dy[i];
if (!judge (tx, ty)) continue;
vis[tx][ty] = true;
if (maze[tx][ty] == 'r') {
ret = min (ret, r.step + 1); continue;
}
else if (maze[tx][ty] == 'x') {
Q.push (Angle (tx, ty, r.step + 2)); continue;
}
else Q.push (Angle (tx, ty, r.step + 1));
}
}
if (ret == INF) puts ("Poor ANGEL has to stay in the prison all his life.");
else printf ("%d\n", ret);
} int main(void) {
while (scanf ("%d%d", &n, &m) == 2) {
for (int i=1; i<=n; ++i) {
scanf ("%s", maze[i] + 1);
}
bool find = false; Angle start;
for (int i=1; i<=n && !find; ++i) {
for (int j=1; j<=m; ++j) {
if (maze[i][j] == 'a') {
start = Angle (i, j, 0);
find = true; break;
}
}
}
BFS (start);
} return 0;
}
当年的代码不忍直视。。。
#include<stdio.h>
typedef struct point
{
int x,y,step;
}target;
int N,M,dir[4][2]={0,1,0,-1,1,0,-1,0},ax,ay;
int flag[202][202];
char map[302][302];
target que[40005];
int BFS(target start)
{
int end,top,i;
int min=1000000;
target in,next;
end=top=0;
que[top]=start;
while (top>=end)
{
in=que[end];
end=(end+1);
for (i=0;i<4;i++)
{
next.x=in.x+dir[i][0];
next.y=in.y+dir[i][1];
if (map[next.x][next.y]=='r')
{
if (min>in.step+1)
min=in.step+1;
}
if (next.x>=0&&next.x<N&&next.y>=0&&next.y<M&&map[next.x][next.y]!='#')
{
if (flag[next.x][next.y]>in.step+1)
{
next.step=in.step+1;
if (map[next.x][next.y]=='x')
next.step++;
flag[next.x][next.y]=next.step;
top=(top+1);
que[top]=next;
}
}
}
}
if (min!=1000000)return min;
else
return -1;
}
int main()
{
int i,j,num;
target start;
while (scanf("%d%d",&N,&M)!=EOF)
{
for (i=0;i<N;i++)
{
scanf("%s",map[i]);
for (j=0;j<M;j++)
{
flag[i][j]=1000000;
if (map[i][j]=='a')
{
//map[i][j]='.';
ax=i;
ay=j;
}
}
}
start.x=ax;
start.y=ay;
start.step=0;
//map[ax][ay]='.';
num=BFS(start);
if (num==-1)
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n",num);
}
return 0;
}
BFS HDOJ 1242 Rescue的更多相关文章
- hdoj 1242 Rescue
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...
- hdu 1242:Rescue(BFS广搜 + 优先队列)
Rescue Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- hdu - 1242 Rescue && hdu - 2425 Hiking Trip (优先队列+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1242 感觉题目没有表述清楚,angel的朋友应该不一定只有一个,那么正解就是a去搜索r,再用普通的bfs就能过了 ...
- HDU 1242 Rescue (BFS(广度优先搜索))
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu 1242 Rescue(bfs)
此刻再看优先队列,不像刚接触时的那般迷茫!这也许就是集训的成果吧! 加油!!!优先队列必须要搞定的! 这道题意很简单!自己定义优先级别! +++++++++++++++++++++++++++++++ ...
- HDU 1242 Rescue(BFS+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description Angel was caught by t ...
- hdu 1242 Rescue (BFS)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU 1242 -Rescue (双向BFS)&&( BFS+优先队列)
题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...
随机推荐
- Monkey测试的参数
一.Monkey测试简介 Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动Trackball.按键等操作来对设备上的程序进行压 力测试,检测程序多久 ...
- 直播:中国HBase技术社区第一届MeetUp
6月6日,由中国HBase技术社区组织,阿里云主办的中国第一届HBase Meetup将在北京举行,来自阿里.小米.滴滴.360等公司的各位大神会共同探讨HBase2.0的技术革新,HBase在国内各 ...
- rpm的gpg key
1 gpg 这是一种公钥.私钥机制. 2 rpm包的格式 rpm包由四部分构成,lead.signature.header和archive构成. 这里的签名(signature)是加密了的,也就是说, ...
- Delphi之萝莉调教篇
本文纯属技术交流.如果各位看官想与小生一起探讨萝莉的问题的话...PM我吧 关于Delphi的萝莉调教技术,很久以前就有大牛做过了...其实技术早掌握了只是觉得太无聊~估计大家也都会于是就没有写~既然 ...
- SpringMVC 学习笔记(四) 处理模型数据
Spring MVC 提供了下面几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体就可以通过该对象加入模型数据 – Map及Model: ...
- redis03----集合 set 相关命令
集合 set 相关命令 集合的性质: 唯一性,无序性,确定性 注: 在string和link的命令中,可以通过range 来访问string中的某几个字符或某几个元素 但,因为集合的无序性,无法通过下 ...
- kbmMemTable关于内存表的使用,以及各种三层框架的评价
关于内存表的使用(kbmMemTable) 关于内存表的使用说明一. Delphi使用内存表1.1 Delphi创建内存表步骤:1. 创建一个Ttable实例.2. 设置一个DataBaseName为 ...
- jconsole工具检测堆内存变化的使用
jconsole将Java写的程序检测. 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使 ...
- DedeCMS模板中用彩色tag做彩色关键词
DedeCMS模板中用彩色tag做彩色关键词,下面分享一下吧!修改方法: 1.在/include/common.func.php 中加入如下函数: function getTagStyle() { $ ...
- linux初级学习笔记二:linux操作系统及常用命令,文件的创建与删除和命名规则,命令行展开以及linux中部分目录的作用!(视频序号:02_3)
本节学习的命令:tree,mkdir,rmdir,touch,stat,rm 本节学习的技能:Linux中主要的目录作用以及特殊的目录文件: 文件的命名规则,命令行展开: 文件的创建与删除: Linu ...