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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hdoj 1242 Rescue (bfs+优先队列)

运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能...

HDOJ 1242 Rescue (BFS+优先队列)

http://acm.hdu.edu.cn/showproblem.php?pid=1242 题意:天使被关入了恶魔的监狱,他的朋友们要救他出去,根据给出的“地图“求他的朋友们到达他的位置的最短时间...

HDU/HDOJ 1242 Rescue 典型的迷宫广度优先搜索题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目大意:在含有障碍的迷宫中求从一点到一点的最短时间或步数,这个题目有个坑爹的地方,天使的朋友...

HDOJ 1242 Rescue(BFS + 优先队列)

Rescue Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. Th...

hdoj 1242 Rescue(bfs)

【题目大意】:某人a被关在了监狱里,监狱里有路有墙有看守者x,他的朋友们r想去营救他出来,但没前进一个需要消耗时间1,每遇到一个守卫又要花费时间1去杀死他,问最少多少时间可以把a救出来,救不出来输出"...

hdoj 1242 Rescue (BFS)

Rescue http://acm.hdu.edu.cn/showproblem.php?pid=1242 Time Limit: 2000/1000 MS (Java/Others)    Mem...

HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)

Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is...

HDOJ 1242 Rescue (BFS + 优先队列)

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242 一、题目描述 =========================================...

HDOJ 1242/ZOJ 1649 Rescue

【题号】HDOJ 1242/ZOJ 1649 【题目描述】 Rescue Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 65536...

【杭电】[1242]Rescue

虽然学长把这题取名为BFS…… 不过一时脑抽没分清BFS是深搜还是广搜 所以用的DFS做的不过对于这种水题其实都一样啦 没什么坑点 用一个二维数组保存每个点到终点的距离 然后递归搜索 遇见...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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