/*
translation:
一张二维平面的图,每个点可能遭到流星的轰炸,同时该点的上下左右四个点都被摧毁。
在该店被轰炸之后任何时间内不允许通过。一开始在原点处,求多久才能到达安全区域?
solution:
多加了轰炸之后不能通过这一条件。就是按普通的广搜来,没难度。
note:
1:打死出题人,WA了不知道多少发就是因为这SB出题人明明说了数据不会超过300,结果
在测试数据里来了个302的数据!! dame you!
date:
2016.10.20
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int maxm = 50000 + 5;
const int INF = 1e8;
int point[800][800];
int m, last;
bool vis[800][800];
int dirx[] = {1, -1, 0, 0};
int diry[] = {0, 0, 1, -1};
struct Node
{
int x, y, t;
Node(int x_, int y_, int t_) : x(x_), y(y_), t(t_) {}
Node(){}
};
bool check(int x, int y, int t)
{
if(t < point[x][y]) return true;
else return false;
}
bool inside(int x, int y)
{
return x >= 0 && y >= 0;
}
int bfs()
{
queue<Node> q;
q.push(Node(0, 0, 0));
while(!q.empty())
{
Node u = q.front(); q.pop();
int tx = u.x, ty = u.y;
if(vis[tx][ty]) continue;
vis[tx][ty] = true;
if(point[tx][ty] == INF) return u.t;
else
{
for(int d = 0; d < 4; d++)
{
int nx = tx + dirx[d];
int ny = ty + diry[d];
if(check(nx, ny, u.t+1) && !vis[nx][ny] && inside(nx, ny))
q.push(Node(nx, ny, u.t+1));
}
}
}
return -1;
}
int main()
{
//freopen("in.txt", "r", stdin);
while(~scanf("%d", &m))
{
memset(vis, 0, sizeof(vis));
for(int i = 0; i <= 400; i++)
for(int j = 0; j <= 400; j++)
point[i][j] = INF;
int x, y, t;
last = -1;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &x, &y, &t);
last = max(last, t);
point[x][y] = min(point[x][y], t);
for(int d = 0; d < 4; d++)
{
int nx = x + dirx[d], ny = y + diry[d];
if(inside(nx, ny)) point[nx][ny] = min(point[nx][ny], t);
}
}
if(point[0][0] == 0) printf("-1\n");
else printf("%d\n", bfs());
}
return 0;
}
poj3669(有坑的bfs,mdzz出题人系列)
最新推荐文章于 2019-11-07 09:56:16 发布