只有28分,求助大佬!求调!求调!

P2895 [USACO08FEB] Meteor Shower S

acmwriter @ 2023-06-01 23:50:09

#include<bits/stdc++.h>
using namespace std;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
int a[305][305],b[305][305];
struct node{
    int x,y,sum;
};
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int c,d,t;
        cin>>c>>d>>t;
        for(int j=0;j<5;j++){
            if(c+dx[j]>=0&&c+dx[j]<=300&&d+dy[j]>=0&&d+dy[j]<=300){
                a[c+dx[j]][d+dy[j]]=t;
            }
        }
    }
    queue<node>q;
    node F={0,0,0};
    b[0][0]=1;
    q.push(F);
    while(!q.empty()){
        node N=q.front();
        q.pop();
        if(a[N.x][N.y]==0){
            cout<<N.sum;
            return 0;
        }
        for(int i=1;i<5;i++){
            int sx=N.x+dx[i];
            int sy=N.y+dy[i];
            if(sx>=0&&sx<=300&&sy>=0&&sy<=300&&!b[sx][sy]){
                if(N.sum+1<a[sx][sy]){
                node E={sx,sy,N.sum+1};
                b[sx][sy]=1;
                q.push(E);
                }
                if(a[sx][sy]==0){
                    cout<<N.sum+1;
                    return 0;
                }
            }
        }
    }
    cout<<-1;
    return 0;
}

by ricky_lin @ 2023-06-02 07:28:39

@acmwriter

有没有可能,有两个陨石会影响同一个地方的情况,让同一个地方被烧焦两次

还有一个地方就是,可能就是走出安全区要走出牧场

当然下面这个代码只是能过,走出左边界和上边界的因为越界,需要进行处理,可能会影响代码理解性我太懒了,也算是留一点给你自己写(方法就是整体向右下方移动几格。

int main(){
    int n;
    cin>>n;
    memset(a,0x3f,sizeof(a));//change 1
    for(int i=0;i<n;i++){
        int c,d,t;
        cin>>c>>d>>t;
        for(int j=0;j<5;j++){
            if(c+dx[j]>=0&&c+dx[j]<=302&&d+dy[j]>=0&&d+dy[j]<=302){
                a[c+dx[j]][d+dy[j]]=min(t,a[c+dx[j]][d+dy[j]]);//取最小的被烧焦的时间 change2
            }
        }
    }
    queue<node>q;
    node F={0,0,0};
    b[0][0]=1;
    q.push(F);
    while(!q.empty()){
        node N=q.front();
        q.pop();
        if(a[N.x][N.y]==0x3f3f3f3f){//对应改一下 change3
            cout<<N.sum;
            return 0;
        }
        for(int i=1;i<5;i++){
            int sx=N.x+dx[i];
            int sy=N.y+dy[i];
            if(sx>=0&&sx<=302&&sy>=0&&sy<=302&&!b[sx][sy]){//跑出牧场 change4
                if(N.sum+1<a[sx][sy]){
                node E={sx,sy,N.sum+1};
                b[sx][sy]=1;
                q.push(E);
                }
                if(a[sx][sy]==0x3f3f3f3f){//change 5
                    cout<<N.sum+1;
                    return 0;
                }
            }
        }
    }
    cout<<-1;
    return 0;
}

by acmwriter @ 2023-06-02 23:46:53

@ricky_lin 感谢大佬,已过


|