63pts后全RE

P2895 [USACO08FEB] Meteor Shower S

LiJoQiao @ 2023-05-31 18:13:17

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXM=50010,MAXX=310;
struct Star
{
    int X,Y,T;
}stars[MAXM];
int M,ans=-1,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
queue<int> x,y,t;
bool map[MAXX][MAXX],mapf[MAXX][MAXX],vis[MAXX][MAXX];
bool cmp(Star a,Star b);
void bfs();
int main()
{
    scanf("%d",&M);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d%d",&stars[i].X,&stars[i].Y,&stars[i].T);//输入部分
    }
    sort(stars+1,stars+M+1,cmp);//输入完进行排序方便模拟
    // for(int i=1;i<=M;i++)
    // {
    //     printf("Stars:X=%d Y=%d T=%d\n",stars[i].X,stars[i].Y,stars[i].T);
    // }
    for(int i0=1;i0<=M;i0++)
    {
        int sdx=stars[i0].X,sdy=stars[i0].Y,nx,ny;
        mapf[sdx][sdy]=true;
        for(int i=0;i<4;i++)
        {
            nx=sdx+dx[i];
            ny=sdy+dy[i];
            mapf[nx][ny]=true;
        }
    }
    bfs();//开始搜索
    printf("%d",ans);//输出
    return 0;
}
void bfs()
{
    int nowx,nowy,nowt,nowstar=1,nxtx,nxty,nxtt,nxtstar;
    x.push(0);//初始状态放入队列
    y.push(0);
    t.push(0);
    while(!x.empty())
    {
        nowx=x.front();//取出
        nowy=y.front();
        nowt=t.front();
        x.pop();//删除
        y.pop();
        t.pop();
        if(vis[nowx][nowy]==true)
            continue;//跳过重复搜索
        vis[nowx][nowy]=true;
        // printf("x=%d y=%d t=%d\n",nowx,nowy,nowt);
        if(!(nowx==0&&nowy==0)&&mapf[nowx][nowy]==false/*无流星的区域*/||(nowstar>M&&nowt!=stars[nowstar-1].T/*最后一个流星标完还要继续搜*/)/*流星落完了*/)
        {
            ans=nowt;
            return;
        }
        while(nowt==stars[nowstar].T)//先标记流星
        {
            int sdx=stars[nowstar].X,sdy=stars[nowstar].Y,nx,ny;
            map[sdx][sdy]=true;
            for(int i=0;i<4;i++)
            {
                nx=sdx+dx[i];
                ny=sdy+dy[i];
                map[nx][ny]=true;
            }
            nowstar++;//下一个
            //不设循环可能漏
        }
        //有被流星突然炸死的可能
        if(map[nowx][nowy]==true)//被炸死直接重开吧
            continue;
        nxtt=nowt+1;
        for(int i=0;i<4;i++)
        {
            nxtx=nowx+dx[i];
            nxty=nowy+dy[i];
            if(nxtx>=0&&nxty>=0&&map[nxtx][nxty]==false)//可以经过
            {
                x.push(nxtx);
                y.push(nxty);
                t.push(nxtt);
            }
        }
    }
}
bool cmp(Star a,Star b)
{
    if(a.T<b.T)
        return true;
    else
        return false;
}

by LiJoQiao @ 2023-05-31 18:30:14

数组开到700解决了(虽然不知道为什么)


by xxxxxxxb @ 2023-07-20 22:53:25

@LiJoQiao 贝西可以跑出流星雨下落的范围(300,300),如果在某个情况她跑到311,311安全但是在这时数组越界(

亲测数组开353,353可以


by LiJoQiao @ 2023-07-21 00:27:04

@xxxxxxxb 感谢


|