Poj3669 meteor shower bfs

题目链接:http://poj.org/problem?id=3669

题目大意:女主牛在起点(0,0),天气预报说今天会下流星雨,女主牛得逃生,流星砸下来它的附近的四个格点的位置都会被毁灭,以后不能再走,女主牛每次可走在地图范围内的四个格点,问女主牛至少得走多少歩才能安全。

分析:这个题目至少,明显是bfs,但又和以前的bfs不一样,唔。。。后来看了别人的结题报告才明白要自己够遭地图,先构建地图,被砸的点及四个相邻格点在时间T以便不能过人了,注意如果有点被多颗流星砸到,那么选时间值最小的,原因么,自己体会,搜索的终点是能否到达一个永远不会被砸到的地方。

另外,自己的题量还是不够啊。

code:

#include<cstdio>
#include<cstring>
#include<queue>
#define min(a,b) (a<b?a:b)
using namespace std;
const int MAXN=305;
const int INF=99999999;
struct node{int x,y,step,time;}s;
int a[MAXN][MAXN],visit[MAXN][MAXN];//visit标记是否已经走过
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,1,-1};//可以走的五个方向
void bfs(){
    queue<node>q;
    while(!q.empty())q.pop();
    s.x=0,s.y=0,s.step=0,s.time=0;
    q.push(s);
    while(!q.empty()){
        node ne=q.front();q.pop();
        for(int i=0;i<5;++i){
            node no;
            no.x=ne.x+dx[i];
            no.y=ne.y+dy[i];
            no.step=ne.step;
            no.time=ne.time+1;
            if(no.x>=0&&no.x<MAXN&&no.y>=0&&no.y<MAXN&&!visit[no.x][no.y]&&no.time<a[no.x][no.y]){//在地图内,点没走过,地图还没被毁
                visit[no.x][no.y]=1;
                no.step++;
                if(a[no.x][no.y]==INF){printf("%d\n",no.step);return;}
                q.push(no);
            }
        }
    }
    printf("-1\n");//没有找到这样一个地方,打印-1
}
int main(void){
    for(int i=0;i<MAXN;++i)
        for(int j=0;j<MAXN;++j)
            a[i][j]=INF;//初始化假设所有的点永远不会被砸到
    memset(visit,0,sizeof(visit));
    int M;scanf("%d",&M);
    for(int i=0;i<M;++i){
        int x,y,t;
        scanf("%d%d%d",&x,&y,&t);
        for(int i=0;i<5;++i){
            int nx=x+dx[i],ny=y+dy[i];
            if(nx>=0&&nx<MAXN&&ny>=0&&ny<MAXN)
                a[nx][ny]=min(a[nx][ny],t);
        }
    }//构图
    bfs();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值