您的位置:首页 > 产品设计 > UI/UE

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

2012-04-03 23:14 288 查看
BFS时使用优先级队列
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

using namespace std;

const int maxn = 505;
int cas, h, w, d;
int sx, sy, tx, ty;
char map[maxn][maxn];
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

struct Pos
{
int x, y, t;
friend bool operator < (Pos p1, Pos p2)
{
return p1.t > p2.t;
}
};

bool inMap(int x, int y)
{
return (x >= 0 && x < h && y >= 0 && y < w);
}

int bfs()
{
priority_queue<Pos> Q;
Pos cur, nxt;
cur.x = sx; cur.y = sy; cur.t = 0;
Q.push(cur);
map[sx][sy] = '#';

while (!Q.empty())
{
cur = Q.top();
Q.pop();
if (cur.x == tx && cur.y == ty)
return cur.t + 1;
for (int i = 0; i < 4; ++i)
{
nxt.x = cur.x + dir[i][0];
nxt.y = cur.y + dir[i][1];
if (inMap(nxt.x, nxt.y) && map[nxt.x][nxt.y] != '#')
{
if (map[nxt.x][nxt.y] == '.')
nxt.t = cur.t + 1;
else nxt.t = cur.t + d + 1;
map[nxt.x][nxt.y] = '#';
Q.push(nxt);
}
}
}
}

int main()
{
scanf("%d", &cas);
while (cas--)
{
scanf("%d %d %d", &h, &w, &d);
for (int i = 0; i < h; ++i)
scanf("%s", map[i]);
for (int i = 0; i < h; ++i)
{
for (int j = 0; j < w; ++j)
{
if (map[i][j] == 'S')
sx = i, sy = j;
if (i == 0 || i == h - 1 || j == 0 || j == w - 1)
if (map[i][j] != '#')
tx = i, ty = j;
}
}
printf("%d\n", bfs());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: