hdoj1242 Rescue

原创 2016年04月11日 17:46:27

题意:

  这道题是常规的BFS,加上了一个”打怪”的设置,而”打怪”实质上就是步数加1的操作罢了.如果用的是queue而不是priority_queue,(我觉得用queue就可以了),得维持”访问的节点的步数递增”这样一个原则,也就是:
  如果当前位置是”x”即guard的时候,要打到guard,具体代码中的操作是:
  (1)新增加一个该位置的节点push进queue,其中该节点的步数要增加1;
  (2)把该位置的”x”修改成例如”.”这样可以走的路.因为如果不修改的话,(1)的过程会不停进行下去,而且从故事的角度而言也是合理的,毕竟guard被打倒,可以理解成”消失”了.另外,做过类似的题目中有”血量”的设置,即怪物血量为k的话,就要停留k秒(或者说步数加k),这样的话,每次进行(2)操作,该数字k就可以变成k-1,来模拟每次打1血的情况,变成0之后,就可以继续走路了.

代码:

// 202ms, 1892K
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

struct Position {
    int x, y, step;

    Position(int x, int y, int s) : x(x), y(y), step(s) {
    }
};

const int FAIL_RETURN_VALUE = -1;
const int DIR[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
const int MAXN(201);
char maze[MAXN][MAXN];
bool isVisited[MAXN][MAXN];
int row, col;
int start_x, start_y;

inline bool isValid(const int &x, const int &y) {
    return x >= 0 && y >= 0 && x < row && y < col;
}

int bfs() {
    queue<Position> positions;
    isVisited[start_x][start_y] = true;
    positions.push( Position(start_x, start_y, 0) );
    while (!positions.empty()) {
        Position cur = positions.front();
        positions.pop();
        //cout << "(" << cur.x << ", " << cur.y << "):" << cur.step << endl;
        if (maze[cur.x][cur.y] == 'a') {    // succeed to save ANGEL! so return the least steps
            return cur.step;
        } else if (maze[cur.x][cur.y] == 'x') { // need to beat the GUARD, so step += 1
            positions.push( Position(cur.x, cur.y, cur.step + 1) );
            maze[cur.x][cur.y] = '.';   // KEY! It can be explained as 'the GUARD is beaten and then disappear'
            continue;
        }
        for (int dir = 0; dir < 4; ++dir) {
            int xx = cur.x + DIR[dir][0];
            int yy = cur.y + DIR[dir][1];
            if (isValid(xx, yy) && !isVisited[xx][yy] && maze[xx][yy] != '#') { // those which can walk
                isVisited[xx][yy] = true;
                positions.push( Position(xx, yy, cur.step + 1) );
            }
        }
    }
    return FAIL_RETURN_VALUE;
}


int main() {
//  freopen("in.txt", "r", stdin);
    while (cin >> row >> col) {

        memset(isVisited, false, sizeof isVisited);

        for (int i(0); i < row; ++i) {
            for (int j(0); j < col; ++j) {
                cin >> maze[i][j];
                if (maze[i][j] == 'r') {
                    start_x = i;
                    start_y = j;
                }
            }
        }

        int result = bfs();
        if (result == FAIL_RETURN_VALUE) {
            cout << "Poor ANGEL has to stay in the prison all his life." << endl;
        } else {
            cout << result << endl;
        }

    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 1242 Rescue (搜索 DFS)

题意:天使被困在监狱,他的朋友们想见他,监狱的地形复杂,包括路(用点标示),墙(用#标示),天使的位置(用a标示),他的朋友(用r标示),监狱里还有守卫(用x标示),他的朋友只能向左右上下四个方向走,...
  • IAccepted
  • IAccepted
  • 2014年04月07日 14:14
  • 2929

Rescue<hdoj1242>

Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison ...
  • KingJordon
  • KingJordon
  • 2016年07月29日 16:07
  • 111

【记忆化DFS】HDOJ1242 Rescue

【题目】 Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot...
  • iSerendipity
  • iSerendipity
  • 2015年08月25日 17:22
  • 302

电脑启动进入rescue mode的解决方案

问题windwos系统升级以后出现如下错误:error: no such partition. Entering rescue mode... grub rescue>开机即进入这个模式,无法进入系统...
  • u010896929
  • u010896929
  • 2016年10月28日 18:19
  • 3203

开机出现grub rescue,修复办法

出现这种问题 一般在于进行了磁盘分区(GHOST备份时也会造成)导致grub引导文件找不到。我们只要让它找到引导文件就好了。 此时屏幕上提示grub resume>  我们先输入set看下现在gru...
  • peerless1994
  • peerless1994
  • 2016年08月16日 23:47
  • 11371

安装Ubuntu 开机出现 grub rescue> 终端模式修复方法

GRUB(统一引导装入器)是基本的Linux引导装入器。 其具有四个作用,如下: 1.选择操作系统(计算机上安装多个操作系统); 2.表示相应的引导文件所在的分区; 3.找到内核; 4.运行...
  • xiaomingtongxie
  • xiaomingtongxie
  • 2017年03月03日 16:36
  • 860

no such device Entering rescue mode grub rescue

电脑开始出现这个 no such device 电脑开机出现这个界面。 首先说下我怎么会出现这个界面的吧,我是装了双系统,win10 和Ubuntu 。我的Ubuntu装好后,鼠标没用,所以我就在...
  • zhou906767220
  • zhou906767220
  • 2017年03月21日 22:39
  • 1404

Ubuntu引导修复:针对grub rescue||grub not found||unknown filesystem类型的错误

引言  Ubuntu一般是通过grub引导。grub分为三种:grub,grub2,和grub for dos(grub4dos).   最近在Windows下将一个较大的分区分了100G出来,准备...
  • yongf2014
  • yongf2014
  • 2015年07月12日 15:10
  • 1437

Ruby最佳实践--不要rescue Exception,rescue StandardError

重构前显式地捕获Exception将会捕获甚至会捕获非正常可修复的错误比如SyntaxError, LoadError, and Interrupt。begin foo rescue Except...
  • liuk10
  • liuk10
  • 2016年04月07日 14:31
  • 787

杭电1242--Rescue--BFS 广度优先算法详解

题目描述就不多说了,给出地址:http://acm.hdu.edu.cn/showproblem.php?pid=1242 这道题目比较简单,可以采用DFS,也可采用深度优先搜索,上一次我们...
  • zhuihunmiling
  • zhuihunmiling
  • 2013年05月27日 14:04
  • 2473
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdoj1242 Rescue
举报原因:
原因补充:

(最多只允许输入30个字)