hdu 4198 Quick out of the Harbour

原创 2015年07月07日 19:23:45

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4198
bfs+优先队列。。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
using std::cin;
using std::cout;
using std::endl;
using std::find;
using std::sort;
using std::map;
using std::pair;
using std::vector;
using std::multimap;
using std::priority_queue;
#define pb(e) push_back(e)
#define sz(c) (int)(c).size()
#define mp(a, b) make_pair(a, b)
#define all(c) (c).begin(), (c).end()
#define iter(c) decltype((c).begin())
#define cls(arr,val) memset(arr,val,sizeof(arr))
#define cpresent(c, e) (find(all(c), (e)) != (c).end())
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i)
const int N = 510;
typedef unsigned long long ull;
bool vis[N][N];
char G[N][N];
int H, W, C, Sx, Sy, Dx, Dy;
const int dx[] = { 0, 0, -1, 1 }, dy[] = { -1, 1, 0, 0 };
struct Node {
    int x, y, s;
    Node(int i = 0, int j = 0, int k = 0) :x(i), y(j), s(k) {}
    inline bool operator<(const Node &a) const {
        return s > a.s;
    }
};
int bfs() {
    priority_queue<Node> q;
    q.push(Node(Sx, Sy, 0));
    vis[Sx][Sy] = true;
    while (!q.empty()) {
        Node t = q.top(); q.pop();
        if (t.x == Dx && t.y == Dy) return t.s;
        rep(i, 4) {
            int x = t.x + dx[i], y = t.y + dy[i];
            if (x < 0 || x >= H || y < 0 || y >= W) continue;
            if (G[x][y] == '#' || vis[x][y]) continue;
            if (G[x][y] == '@') q.push(Node(x, y, t.s + C + 1));
            else if (G[x][y] == '.') q.push(Node(x, y, t.s + 1));
            vis[x][y] = true;
        }
    }
    return -1;
}
int main() {
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w+", stdout);
#endif
    int t;
    scanf("%d\n", &t);
    while (t--) {
        scanf("%d %d %d", &H, &W, &C);
        rep(i, H) {
            scanf("%s", G[i]);
            rep(j, W) {
                vis[i][j] = false;
                if (G[i][j] == 'S') Sx = i, Sy = j;
                if (i == H - 1 || i == 0 || j == 0 || j == W - 1) {
                    if (G[i][j] != '#') Dx = i, Dy = j;
                }
            }
        }
        printf("%d\n", bfs() + 1);
    }
    return 0;
}

相关文章推荐

HDU_4198_Quick out of the Harbour(优先队列BFS)

题型:搜索

hdu4198——Quick out of the Harbour

Problem Description Captain Clearbeard decided to go to the harbour for a few days so his crew coul...

hdu 4198 Quick out of the Harbour

 Quick out of the Harbour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

hdu 4198 Quick out of the Harbour(BFS+优先队列)

题目链接:hdu4198 题目大意:求起点S到出口的最短花费,其中#为障碍物,无法通过,‘.’的花费为1 ,@的花费为d+1。 需注意起点S可能就是出口,因为没考虑到这个,导致WA很多次........

HDOJ 4198 Quick out of the Harbour(BFS)

Quick out of the Harbour Problem Description Captain Clearbeard decided to go to the harbour for...

hdoj 4198 Quick out of the Harbour

类型:bfs + 优先队列 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4198 来源:BAPC 2011 思路:扩展完当前节点后,将"路径"小的节...

hdoj 4198 Quick out of the Harbour(bfs,优先队列)

一个裸的bfs+优先队列,居然还MLE两次,WA两次,哎 MLE:忘记book[tx][ty] = 1了,还找了半天哪里会MLE啊。。。 WA:没考虑到S就在边界的情况。。。 代码: #i...
  • CillyB
  • CillyB
  • 2016年11月04日 22:49
  • 150

hdoj 4198 Quick out of the Harbour 优先队列 + bfs

思路:对于普通迷宫求解,bfs可以到到唯一解,也是最优解。但对于不同点具有不同权值的地图就不一定了,很可能最优值会被pass掉,但使用优先队列的话,访问当前的点总是以前一个优先权最高的点访问的。 #...

HDU 4198 Quick out of the Harbour

Problem Description Captain Clearbeard decided to go to the harbour for a few days so his crew co...

hrbust 1434 Quick out of the Harbour【Bfs+优先队列】

Quick out of the Harbour Time Limit: 3000 MS Memory Limit: 65536 K Total ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4198 Quick out of the Harbour
举报原因:
原因补充:

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