hdu 2612 Find a way (BFS~)
2017-11-01 20:36
375 查看
我发现我做题就很暴力,几个队列,vector一起上,然后搜搜搜,直接导致我这题TLE了好几次。
看了别人的码以后,发现对全部目标位置的时间打表是很很不错的选择!这样要长记性了!
除了TLE,要注意的是:
vis数组和Dvis数组的在两个起点广搜之前的初始化,以及!!!Y和M是不能走的!!!还有有一个终点无法到达的情况要考虑,我在这里WA了一发:
然后专题一还剩两个有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;
}
看了别人的码以后,发现对全部目标位置的时间打表是很很不错的选择!这样要长记性了!
除了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;
}
相关文章推荐
- HDU 2612 Find a way (BFS)
- HDU 2612 Find a way (BFS)
- 【HDU 2612】Find a way(BFS)
- HDU 2612 Find a way(BFS)
- HDU 2612 Find a way(两次BFS)
- hdu 2612:Find a way(经典BFS广搜题)
- HDU 2612 find a way(双搜索)BFS
- HDU - 2612 Find a way 双起点bfs
- Find a way HDU - 2612 两点BFS
- 【BFS】HDU 2612 Find a way
- hdu 2612 Find a way(BFS)
- H - Find a way HDU - 2612 ——2次BFS
- HDU 2612 Find a way(bfs)
- hdu-2612-find a way(bfs)
- HDU 2612 Find a way (两次bfs)
- Hdu 2612 Find a Way(双点bfs)
- HDU - 2612 Find a way(15.10.10 搜索专题)bfs
- HDU 2612 Find a way (BFS)
- Find a way(bfs)HDU - 2612
- hdu 2612 Find a way (BFS)