您的位置:首页 > 其它

hdu 2612 Find a way (BFS~)

2017-11-01 20:36 375 查看
我发现我做题就很暴力,几个队列,vector一起上,然后搜搜搜,直接导致我这题TLE了好几次。

看了别人的码以后,发现对全部目标位置的时间打表是很很不错的选择!这样要长记性了!

除了TLE,要注意的是:

vis数组和Dvis数组的在两个起点广搜之前的初始化,以及!!!Y和M是不能走的!!!还有有一个终点无法到达的情况要考虑,我在这里WA了一发:

Sample input:
5 5
Y..#@
...M.
...##
.....
@....

sample output:
110


然后专题一还剩两个有Bug的码没改,其他就都写完了,终于可以去撸我的项目了。这周日再开始写专题二!

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
#define MAX 900
#define INF 0x3f3f3f3f

using namespace std;

int n, m;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int vis[MAX][MAX];
char map[MAX][MAX];
int Wall[MAX][MAX];
int Dvis[MAX][MAX];
typedef struct { int x, y; } des;
typedef struct { int x, y, cnt; } per;
int Time[MAX][MAX];
queue<per> yQ;
vector<des> V;
int Tdx, Tdy;
void BFS(per a) {
while (!yQ.empty()) yQ.pop();

yQ.push(a);

per afront;
afront = a;

while (!yQ.empty()) {
vis[afront.x][afront.y] = 1;
afront = yQ.front();
Tdx = afront.x;
Tdy = afront.y;
yQ.pop();

if (!Dvis[afront.x][afront.y] && map[afront.x][afront.y] == '@') {
Time[afront.x][afront.y] += afront.cnt;
Dvis[afront.x][afront.y] = 1;
}
for (int i = 0; i < 4; i++) {
per temp;
int Dx = afront.x + dx[i];
int Dy = afront.y + dy[i];
temp.x = Dx;
temp.y = Dy;
temp.cnt = afront.cnt + 1;
if (!vis[Dx][Dy] && Dx >= 0 && Dx < n && Dy >= 0 && Dy < m &&
!Wall[Dx][Dy]) {
vis[Dx][Dy] = 1;
yQ.push(temp);
}
}
}
}

int main(void) {
while (scanf("%d%d", &n, &m) == 2) {
int ans = INF;
memset(Time, INF, sizeof(Time));
per Sa;
per Sb;
V.clear();
memset(Wall, 0, sizeof(Wall));
for (int i = 0; i < n; i++) scanf("%s", map[i]);

for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (map[i][j] == 'Y') {
Wall[i][j] = 1;
Sa = ((per){i, j, 0});
}
if (map[i][j] == 'M') {
Wall[i][j] = 1;
Sb = ((per){i, j, 0});
}
if (map[i][j] == '@') {
Time[i][j] = 0;
}
if (map[i][j] == '#') Wall[i][j] = 1;
}
}
memset(vis, 0, sizeof(vis));
memset(Dvis, 0, sizeof(Dvis));
BFS(Sa);

for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (map[i][j] == '@' && !Dvis[i][j]) Time[i][j] = INF;
}
}
memset(Dvis, 0, sizeof(Dvis));
memset(vis, 0, sizeof(vis));
BFS(Sb);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (map[i][j] == '@' && !Dvis[i][j]) Time[i][j] = INF;
}
}

for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) ans = min(ans, Time[i][j]);
}

printf("%d\n", ans * 11);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: