蒟蒻求助

P2895 [USACO08FEB] Meteor Shower S

明依 @ 2019-03-13 16:01:49

21分,实在改不动了...

#include<bits/stdc++.h>
using namespace std;
int t[50010],x[50010],y[50010],m,d[5]= {1,0,-1,0},e[5]= {0,1,0,-1},ans=99999999,z[510][510];
bool p[510][510]= {0};
void first() {
    for(int i=1; i<=m; i++) {
        for(int j=0; j<5; j++) {
            int xx=x[i]+e[j],yy=y[i]+d[j];
            if(z[xx][yy]>t[i]) z[xx][yy]=t[i];
        }
    }
}//预处理所有的点,看看那些能走哪些不能走
struct egg {
    int x,y,s;
} qwq;
int main() {
    cin>>m;
    for(int i=1; i<=m; i++) cin>>x[i]>>y[i]>>t[i];
    memset(z,0x3f,sizeof(z));//0x3f--1061109567
    first();
    if(z[0][0]==1061109567){
        cout<<0;
        return 0;
    }//啧啧啧运气真好 
    queue<egg>q;
    qwq.x=0;
    qwq.y=0;
    qwq.s=1;
    q.push(qwq);
    p[0][0]=1;
    while(!q.empty()) {
        egg c=q.front();
        q.pop();
        for(int i=0; i<4; i++) {
            int xx=c.x+e[i],yy=c.y+d[i];
            if(z[xx][yy]){
                if(c.s==z[xx][yy]) continue;
            }
            if(xx>=0&&yy>=0&&xx<=310&&yy<=310&&z[xx][yy]==1061109567) {
                if(ans>c.s) ans=c.s;
                break;
            }
            if(xx>=0&&yy>=0&&xx<=310&&yy<=310&&!p[xx][yy]) {
                p[xx][yy]=1;
                qwq.x=xx;
                qwq.y=yy;
                qwq.s=c.s+1;
                q.push(qwq);
            }
        }
    }
    if(ans!=99999999) cout<<ans;
    else cout<<-1;
    return 0;
}

by 明依 @ 2019-03-13 16:07:26

急啊!!在线等


by 稚名真白 @ 2019-03-13 16:47:37

明显要是一个流星在t==1061109567的时候掉下来 你可以走他要落下来的位置 意思是只要你在流星落下之前都可以走到那个位置 所以人走和流星落要一起bfs


by 明依 @ 2019-03-13 16:56:34

找到原因了。在if(z[xx][yy])中应该是c.s>=z[xx][yy]而不是等于


by 稚名真白 @ 2019-03-13 17:05:27

%%%


|