您的位置:首页 > 其它

POJ-3669

2017-12-06 20:01 148 查看
代码:

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef pair<int,int> P;
#define INF 0x3f3f3f3f
int m;
int x[50001],y[50001],t[50001];
int maze[501][501];
int d[501][501];///这样定义数组不太好呀
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};///分别是上下左右四个方向
int bfs()
{
if(maze[0][0]==0)///一开始就被砸
return -1;
queue<P> que;///大写的P(p)比较小
que.push(P(0,0));
d[0][0]=0;
while(!que.empty())
{
P p=que.front();///取出队首元素
que.pop();
int x=p.first,y=p.second;
if(maze[x][y]==INF)///这里的maze是已经初始化好的
return d[x][y];///所以如果这里的maze[x][y]还是INF的话那就代表了这块地方是安全的
for(int i=0;i<4;i++)///经典的思路和代码流程
{
int nx=x+dx[i],ny=y+dy[i];///为啥不限制上界呢
if(d[nx][ny]==INF&&d[x][y]+1<maze[nx][ny]&&nx<=301&&ny<=301&&nx>=0&&ny>=0)
{
que.push(P(nx,ny));
d[nx][ny]=d[x][y]+1;
}
}
}
return -1;
}
void solve()
{
memset(maze,INF,sizeof(maze));///这个INF代表了流星砸到的时间是INF,就是永远也砸不到呀
memset(d,INF,sizeof(d));
for(int i=0;i<m;i++)///自己动手把迷宫构建出来
{
maze[x[i]][y[i]]=min(maze[x[i]][y[i]],t[i]);
for(int j=0;j<4;j++)
{
int nx=x[i]+dx[j],ny=y[i]+dy[j];
if(nx<=301&&ny<=301&&nx>=0&&ny>=0)///把上下界都限制住肯定错不了
maze[nx][ny]=min(maze[nx][ny],t[i]);
}
}
int ans=bfs();
cout<<ans<<endl;
}
int main()///层次很鲜明呀
{
ios::sync_with_stdio(false);///必加
cin>>m;
for(int i=0;i<m;i++)
cin>>x[i]>>y[i]>>t[i];
solve();
return 0;
}

  自己手动创建迷宫,真心强,反正我是想不到这么写;一开始我还想着先把所有所有流星砸到的地方都在maze数组里面记录一下就行了,再一看题,还有时间上的先后问题;后来又想每有一个流星砸过来的时候再对maze数组初始化,然后再bfs搜索一遍,再细想,这也太复杂了吧!

  先把maze数组中的元素都初始化INF,代表流星永远都砸不到(真TM机智),然后再把流星最早砸到某个地方的时间记录到maze数组中以便用于后来时间上比较。真强!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: