您的位置:首页 > 其它

POJ 3669 Meteor Shower

2012-09-28 10:12 169 查看
POJ_3669

广搜一下即可。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define MAXD 310
#define INF 0x3f3f3f3f
int N, danger[MAXD][MAXD], dis[MAXD][MAXD];
int dx[] = {-1, 1, 0, 0, 0}, dy[] = {0, 0, -1, 1, 0};
int inside(int x, int y)
{
return x >= 0 && y >= 0;
}
void init()
{
int i, j, x, y, t, nx, ny;
memset(danger, 0x3f, sizeof(danger));
for(i = 0; i < N; i ++)
{
scanf("%d%d%d", &x, &y, &t);
for(j = 0; j < 5; j ++)
{
nx = x + dx[j], ny = y + dy[j];
if(!inside(nx, ny)) continue;
danger[nx][ny] = std::min(danger[nx][ny], t);
}
}
}
struct St
{
int x, y;
St(){}
St(int _x, int _y) : x(_x), y(_y){}
};
void solve()
{
int i, j, x, y;
std::queue<St> q;
if(danger[0][0] == 0)
{
printf("-1\n");
return ;
}
memset(dis, 0x3f, sizeof(dis)), dis[0][0] = 0;
q.push(St(0, 0));
while(!q.empty())
{
St st = q.front();
if(danger[st.x][st.y] == INF) break;
q.pop();
for(i = 0; i < 4; i ++)
{
x = st.x + dx[i], y = st.y + dy[i];
if(inside(x, y) && dis[st.x][st.y] + 1 < dis[x][y] && danger[x][y] > dis[st.x][st.y] + 1)
dis[x][y] = dis[st.x][st.y] + 1, q.push(St(x, y));
}
}
if(q.empty()) printf("-1\n");
else
{
St st = q.front();
printf("%d\n", dis[st.x][st.y]);
}
}
int main()
{
while(scanf("%d", &N) == 1)
{
init();
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: