大雨应经下了几天雨,却还是没有停的样子。土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没。
CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:“. * X D S”。其中“X”表示石头,水和人都不能从上面经过。“.”表示平原,CCY和洪水都可以经过。“*”表示洪水开始地方(可能有多个地方开始发生洪水)。“D”表示CCY的别墅。“S”表示CCY现在的位置。
CCY每分钟可以向相邻位置移动,而洪水将会在CCY移动之后把相邻的没有的土地淹没(从已淹没的土地)。
求CCY回到别墅的最少时间。如果聪哥回不了家,就很可能会被淹死,那么他就要膜拜黄金大神涨RP来呼叫直升飞机,所以输出“ORZ hzwer!!!”。
Input
3 3
D.*
…
.S.
Output
3
Input
3 3
D.*
…
..S
Output
ORZ hzwer!!!
Input
3 6
D...*.
.X.X..
....S.
Output
6
分析:主要还是考细节和审题,方法很简单,就是bfs,记录洪水到每个点的时间,然后从出发点看到每个点的时间是不是小于洪水到达的时间,但是要看清楚题目的意思,可能会有多个洪水点,这样的话就要放进一个数组里处理,判断能不能走的时候要结合多种情况考虑,做好了这些就可以了.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int maxn = 60,inf = 0x7ffffff; int a[maxn][maxn], n, m, sx, sy, tx, ty, t[maxn][maxn], vis[maxn][maxn],d[maxn][maxn]; int ddx[4] = { 0, 1, -1, 0 }, ddy[4] = { 1, 0, 0, -1 },tot; char s[maxn]; bool flag; struct node { int x, y; }e[maxn * maxn]; void bfs1() { queue <node> q; for (int i = 1; i <= tot; i++) { node temp; temp.x = e[i].x; temp.y = e[i].y; q.push(temp); vis[temp.x][temp.y] = 1; t[temp.x][temp.y] = 0; } while (!q.empty()) { node u = q.front(); q.pop(); for (int i = 0; i < 4; i++) { int nx = u.x + ddx[i], ny = u.y + ddy[i]; if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !vis[nx][ny] && a[nx][ny] == 1) { vis[nx][ny] = 1; t[nx][ny] = t[u.x][u.y] + 1; node temp; temp.x = nx; temp.y = ny; q.push(temp); } } } } void bfs2() { queue <node>q; node temp; temp.x = sx; temp.y = sy; q.push(temp); vis[sx][sy] = 1; while (!q.empty()) { node u = q.front(); q.pop(); if (u.x == tx && u.y == ty) { flag = 1; return; } for (int i = 0; i < 4; i++) { int nx = u.x + ddx[i], ny = u.y + ddy[i]; if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !vis[nx][ny] && (a[nx][ny] || a[nx][ny] == -1) && d[u.x][u.y] + 1< t[nx][ny]) { d[nx][ny] = d[u.x][u.y] + 1; vis[nx][ny] = 1; node temp; temp.x = nx; temp.y = ny; q.push(temp); } } } } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) t[i][j] = inf; for (int i = 1; i <= n; i++) { scanf("%s", s + 1); for (int j = 1; j <= m; j++) { if (s[j] == '.') a[i][j] = 1; if (s[j] == 'X') a[i][j] = 0; if (s[j] == '*') { e[++tot].x = i; e[tot].y = j; } if (s[j] == 'D') { tx = i; ty = j; a[i][j] = -1; } if (s[j] == 'S') { sx = i; sy = j; } } } bfs1(); t[tx][ty] = inf; memset(vis, 0, sizeof(vis)); bfs2(); if (!flag) printf("ORZ hzwer!!! "); else printf("%d ", d[tx][ty]); return 0; }