poj 3669 bfs(这道题隐藏着一个大坑)

题意

在x,y坐标系,有流星会落下来,给出每颗流星落下来的坐标和时间,问你能否从(0,0)这个点到一个安全的位置。所谓的安全位置就是不会有流星落下的位置。

题解:

广搜,但是这里有一个深坑,就是搜索的时候判断坐标是否越界的时候,题中说0≤x≤300,0≤y≤300。也就是说如果 if(x>300||y>300||x<0||y<0) 就是越界,不用进队列。

注意,就是这个 x>300||y>300 越界条件有问题。不能是300,要比300大,哪怕301也行。

下面看我调试了5个小时的AC代码,才发现这个神坑...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int MAX=305;

typedef struct node
{
    node()
    {
        x=y=time=0;
    }
    int x,y;
    int time;
}Node;

int mmap[MAX][MAX];    //地图
int dx[4]={-1,1,0,0};  //方向控制
int dy[4]={0,0,-1,1};
int flag[MAX][MAX];    //标记位

queue<Node> q;

void bfs()
{
    memset(flag,0,sizeof(flag));
    while(!q.empty()) q.pop();

    Node s;   //把原点入队
    s.x=0;
    s.y=0;
    s.time=0;
    q.push(s);
    flag[0][0]=1;

    Node now;
    while(!q.empty())
    {
        Node cur=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int xx=cur.x+dx[i];
            int yy=cur.y+dy[i];
            if(xx<0||yy<0||xx>301||yy>301)    //就是这里,妈的可坑了,题意明明说<=300,也就是说>300不行,他妈的非要>301才能过,那不就是<=301了?
                continue;
            now.x=xx;
            now.y=yy;
            now.time=cur.time+1;
            if(mmap[now.x][now.y]==-1)     //找到安全地点
            {
                cout<<now.time<<endl;
                return;
            }
            if(flag[now.x][now.y]==0)     //如果没有被走过
            {
                if(now.time<mmap[now.x][now.y]||mmap[now.x][now.y]==-1)  //如果当前地点是安全地点或者还没有被流星炸毁
                {
                    flag[now.x][now.y]=1;
                    q.push(now);
                }
            }
        }
    }
    cout<<-1<<endl;
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(mmap,-1,sizeof(mmap));   //地图初始化为-1
        for(int i=0; i<n; i++)        //输入地图信息
        {
            int x,y,t;
            scanf("%d%d%d",&x,&y,&t);
            if(mmap[x][y]!=-1)                    //但要注意的是如果当前流星的坠地时间大于以前的流星的坠地时间,要取最小值
                mmap[x][y]=min(mmap[x][y],t);
            else
                mmap[x][y]=t;
            for(int i=0;i<4;i++)
            {
                int xx=x+dx[i];
                int yy=y+dy[i];
                if(xx<0||yy<0||xx>301||yy>301)   //还有这里也是
                    continue;
                if(mmap[xx][yy]!=-1)           //这个也是,要取最小坠地时间
                    mmap[xx][yy]=min(mmap[xx][yy],t);
                else mmap[xx][yy]=t;
            }
        }
        if(mmap[0][0]==0)         //如果在原点就被炸
            cout<<-1<<endl;
        else
            bfs();
    }
}

  

时间: 2024-10-12 14:56:05

poj 3669 bfs(这道题隐藏着一个大坑)的相关文章

Meteor Shower (poj 3669 bfs)

Language: Default Meteor Shower Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9929   Accepted: 2771 Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destro

POJ 3669 Meteor Shower【BFS】

POJ 3669 去看流星雨,不料流星掉下来会砸毁上下左右中五个点.每个流星掉下的位置和时间都不同,求能否活命,如果能活命,最短的逃跑时间是多少? 思路:对流星雨排序,然后将地图的每个点的值设为该点最早被炸毁的时间 #include <iostream> #include <algorithm> #include <queue> #include <cstring> using namespace std; #define INDEX_MAX 512 int

POJ 3669 Meteor Shower(流星雨)

POJ 3669 Meteor Shower(流星雨) Time Limit: 1000MS    Memory Limit: 65536K Description 题目描述 Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destroy anything they hit. Anxious for her sa

POJ Multiple (BFS,同余定理)

http://poj.org/problem?id=1465 Multiple Time Limit: 1000MS   Memory Limit: 32768K Total Submissions: 6164   Accepted: 1339 Description a program that, given a natural number N between 0 and 4999 (inclusively), and M distinct decimal digits X1,X2..XM

poj 1915 BFS 利用 pre 计算步数------------------路径

// BFS #include <stdio.h> #include <string.h> int visited[301][301]; // visited 已经访问过了 int dic[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}}; int head,end,n,ex,ey,sx,sy; struct quene { int x,y,pre; // pre 前一个结点 }q[100000]; vo

最小生成树,POJ和HDU几道题目的解题报告(基于自己写的模板)

首先POJ题目: 链接:1251 Jungle Roads 题目大意:纯求最小生成树,结果为最小权值边的和.采用邻接表 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 7 #define maxn 30 //最大顶点个数 8 int n; //顶点数,边数 9 10 struct arcn

poj 2243 bfs 利用 结构体中的step成员保存步数 ,STL的队列

//BFS #include <iostream> #include <queue> using namespace std; bool used[8][8]; int move[8][2]={1,2, -1,2, -2,1, -2,-1, -1,-2, 1,-2, 2,-1, 2,1}; struct position { int i,j; int step; position(int a,int b,int c) { i=a; j=b; step=c; } }; int mai

BFS:Meteor Shower(POJ 3669)

     奔跑吧,傻牛 题目大意:这只Bessie的牛又要来闹事了,这次她的任务就是来躲流星雨,流星雨就是在一定时间会从天上砸到Bessie的所在的正方形区域内(Bessie在0,0的位置),然后砸下来后流星雨会把区域内的上下左右区域全部砸烂,并且砸烂后Bessie不能再到这里,Bessie也不能在流星雨打击的地方呆着(也就是只能在流星雨要下来的时间之前才能在这里),问你Bessie要走多少步才能到安全区域 这一道题好玩,我们这样想,Bessie走过的路就是等值的(也就是每走一步都是1),而且还

POJ 3669 Meteor shower 简单BFS, 有坑点

Meteor Shower Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destroy anything they hit. Anxious for her safety, she vows to find her way to a safe location (one that is