宽度优先搜索(BFS):POJ3669--Meteor Shower

本题题意为:陨石落下会砸坏第一象限方块,周围的四个方块也会损坏。你只能在当前完好的方块上逃离,问你能不能逃脱,最短时间是多少?显然这题类似于迷宫问题,求最短路径,一道基本广搜题。应该注意,不可随意的以为到达每个点的时间为x+y,因为像迷宫一样,路可以绕着走。所以时间必须要记录下来。此外,方块何时被损坏是一个要不断更新的过程。原题链接

#include <iostream>
#include <cstring>
#include <queue>
#define MAX_X 302
#define MAX_Y 302
#define INF 0x4f4f4f4f    ///int类型时4个字节,所以用4个4f,以便使用memset函数(用字节填充)
using namespace std;
typedef pair<int,int> P;
const int xi[]={1,0,-1,0};
const int yi[]={0,1,0,-1};
int data[MAX_X][MAX_Y];    ///记录损坏的最先时间
int used[MAX_X][MAX_Y];    ///第一次被使用的时间(记录是第几步到达的)

void bfs(){
    queue<P> que;
    used[0][0]=0;    ///设原点为第0步
    que.push(P(0,0));    ///加入队列第1点
    while(!que.empty()){
        P tmp=que.front();
        int x=tmp.first,y=tmp.second;
        if(data[x][y]==INF){    ///找到安全点
            cout<<used[x][y]<<endl;
            return ;
        }
        que.pop();
        for(int i=0;i<4;i++){
            int xx=x+xi[i],yy=y+yi[i];
            if(data[xx][yy]>used[x][y]+1&&used[xx][yy]>used[x][y]+1&&xx>=0&&yy>=0){
                used[xx][yy]=used[x][y]+1;    ///步数加1
                que.push(P(xx,yy));
            }
        }
    }
    cout<<-1<<endl;    ///已被坏的方块包围!!!
}

int main()
{
    int n;
    cin>>n;
    memset(data,0x4f,sizeof(data));    ///初始化填充数据
    memset(used,0x4f,sizeof(used));
    for(int i=0;i<n;i++){    ///输入数据
        int x,y,t;
        cin>>x>>y>>t;
        data[x][y]=min(data[x][y],t);    ///如果在data[x][y]之前已经损坏,更新自身
        for(int i=0;i<4;i++)
        if(x+xi[i]>=0&&y+yi[i]>=0)
            data[x+xi[i]][y+yi[i]]=min(data[x+xi[i]][y+yi[i]],t);    ///更新相邻节点
    }
    if (data[0][0]==0) cout<<-1<<endl;
    else bfs();
    return 0;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值