poj 3669 Meteor Shower
2016-10-29 17:08
232 查看
题意:流星雨来袭,为了找一个安全的地方,地图相当于平面坐标系第一象限,初始在原点。然后,每颗流星都会在某个时间砸下来,砸到的地方连同上下左右都会毁灭,此地方就不能通过了,他只能走其他地方。移动速度是每时刻移动一步,上下左右,不能对角线移动,求移到安全地点的最小移动速度。
思路:从原点开始搜索,如果当前点是安全的。不然的话向四个方向搜索,如果该方向的点没有搜索过,并且到达该点的时间小于那一点被破坏的时间减一,那么就认为该点是可以到达的,记录到达该点的时间,把该点入队。
搜索的之前的处理是这样的。把每个点都设置为安全(永远不会被破坏),该点被破坏的时间为INF。读入数据的时候,对每一个输入,我们对五个点(输入坐标的点和其上下左右的四个点)进行处理:该点会被破坏,每次取该点被破坏的最小时间。(因为一炸一大片,会有点重合,所以要取最小时间,)-----卡了我好久
#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
#define maxn 400
const int n=305,INF=1012;
struct node
{
int x,y;
bool f;//会不会破坏
int t;//被破坏最小时间
int s;//走到这里需要的最小时间
}p
;
bool isin(int x,int y)
{
return x<=n&&x>=0&&y<=n&&y>=0;
}
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
int step;
bool vis
;
queue<node> q;
node p1,p2;
void bfs()
{
int i,j,k;
while(!q.empty())
{
p1=q.front();
q.pop();
if(p1.f==0){step=p1.s;break;}
for(k=1;k<5;k++)
{
i=p1.x+dx[k];
j=p1.y+dy[k];
if(!vis[i][j]&&isin(i,j))
{
if(p1.s+1<p[i][j].t)
{
p[i][j].s=p1.s+1;
q.push(p[i][j]);
vis[i][j]=1;
}
}
}
}
}
int main()
{
int m,i,x,y,t,j;
while(scanf("%d",&m)!=EOF)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
p[i][j].x=i;
p[i][j].y=j;
p[i][j].f=0;
p[i][j].t=INF;
}
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&t);
for(j=0;j<5;j++)
{
int a=x+dx[j],b=y+dy[j];
if(isin(a,b))
{
p[a][b].f=1;//破坏了
p[a][b].t=min(p[a][b].t,t);
}
}
}
while(!q.empty())
q.pop();
p[0][0].s=0;
q.push(p[0][0]);
vis[0][0]=1;
step=-1;
memset(vis,0,sizeof(vis));
bfs();
printf("%d\n",step);
}
}
思路:从原点开始搜索,如果当前点是安全的。不然的话向四个方向搜索,如果该方向的点没有搜索过,并且到达该点的时间小于那一点被破坏的时间减一,那么就认为该点是可以到达的,记录到达该点的时间,把该点入队。
搜索的之前的处理是这样的。把每个点都设置为安全(永远不会被破坏),该点被破坏的时间为INF。读入数据的时候,对每一个输入,我们对五个点(输入坐标的点和其上下左右的四个点)进行处理:该点会被破坏,每次取该点被破坏的最小时间。(因为一炸一大片,会有点重合,所以要取最小时间,)-----卡了我好久
#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
#define maxn 400
const int n=305,INF=1012;
struct node
{
int x,y;
bool f;//会不会破坏
int t;//被破坏最小时间
int s;//走到这里需要的最小时间
}p
;
bool isin(int x,int y)
{
return x<=n&&x>=0&&y<=n&&y>=0;
}
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
int step;
bool vis
;
queue<node> q;
node p1,p2;
void bfs()
{
int i,j,k;
while(!q.empty())
{
p1=q.front();
q.pop();
if(p1.f==0){step=p1.s;break;}
for(k=1;k<5;k++)
{
i=p1.x+dx[k];
j=p1.y+dy[k];
if(!vis[i][j]&&isin(i,j))
{
if(p1.s+1<p[i][j].t)
{
p[i][j].s=p1.s+1;
q.push(p[i][j]);
vis[i][j]=1;
}
}
}
}
}
int main()
{
int m,i,x,y,t,j;
while(scanf("%d",&m)!=EOF)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
p[i][j].x=i;
p[i][j].y=j;
p[i][j].f=0;
p[i][j].t=INF;
}
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&t);
for(j=0;j<5;j++)
{
int a=x+dx[j],b=y+dy[j];
if(isin(a,b))
{
p[a][b].f=1;//破坏了
p[a][b].t=min(p[a][b].t,t);
}
}
}
while(!q.empty())
q.pop();
p[0][0].s=0;
q.push(p[0][0]);
vis[0][0]=1;
step=-1;
memset(vis,0,sizeof(vis));
bfs();
printf("%d\n",step);
}
}
相关文章推荐
- POJ 3669 Meteor Shower(BFS)
- POJ 3669Meteor Shower(广搜)
- POJ 3669 Meteor Shower(BFS)
- 【POJ 3669】Meteor Shower
- POJ 3669 Meteor Shower(bfs)
- POJ - 3669 Meteor Shower
- POJ 3669 Meteor Shower 《挑战程序设计竞赛(第2版)》练习题
- 【POJ 3669 Meteor Shower】简单BFS
- bfs_poj_3669_Meteor Shower
- [POJ](3669)Meteor Shower ---- bfs+预处理
- POJ 3669 Meteor Shower
- poj 3669 Meteor Shower(bfs)
- POJ 3669 Meteor Shower BFS 水~
- Meteor Shower(POJ 3669)
- POJ3669Meteor Shower【BFS】
- POJ 3669 Meteor Shower(bfs)
- POJ-3669-Meteor Shower
- POJ 3669 Meteor Shower 普通BFS
- POJ 3669 Meteor Shower
- POJ 3669 Meteor Shower BFS 水~