92分代码求助(1个点WA)

P2895 [USACO08FEB] Meteor Shower S

_Ventus_ @ 2022-01-28 10:15:52

#include<bits/stdc++.h>
using namespace std;
int n,x,y,t;
int ma[301][301],v[301][301],ans[301][301];
int dx[5]={0,0,0,1,-1},dy[5]={0,1,-1,0,0};
bool flag=true;
queue<int> q[2];
int ch(int a){
    if(a==-1) return 99999;
    else return a;
}
int main(){
    cin>>n;
    for(int i=0;i<301;i++){
        for(int j=0;j<301;j++) ma[i][j]=-1;
    }
    for(int i=1;i<=n;i++){
        cin>>x>>y>>t;
        for(int j=0;j<=4;j++){
            if(x+dx[j]>=0&&y+dy[j]>=0&&(ma[x+dx[j]][y+dy[j]]==-1||ma[x+dx[j]][y+dy[j]]>t)) ma[x+dx[j]][y+dy[j]]=t;
        } 
    }
    v[0][0]=1;
    q[0].push(0),q[1].push(0);
    while(!q[0].empty()){
        int tx=q[0].front(),ty=q[1].front();
        q[0].pop(),q[1].pop();
        int s=ans[tx][ty]+1;
        if(ma[tx][ty]==-1){ 
            cout<<s-1;
            flag=false;
            break;
        }
        for(int i=1;i<=4;i++){
            int sx=tx+dx[i],sy=ty+dy[i];
            if(sx>=0&&sy>=0&&s<ch(ma[sx][sy])&&v[sx][sy]==0){
                q[0].push(sx),q[1].push(sy);
                v[sx][sy]=1,ans[sx][sy]=s;
            }
        }
    }
    if(flag) cout<<-1;
    return 0;
}

by Swiftie_wyc22 @ 2022-02-16 23:23:48

同问我也错在最后一点


by Swiftie_wyc22 @ 2022-02-16 23:28:23

啊我做出来了,我来帮你了~

判断的范围小了,你把判断下一个坐标放到400以内就可以。最后一个样例卡的很死

附上我的代码:

#include <bits/stdc++.h>
using namespace std;
int a[400][400], m;
bool vis[400][400];
struct node{
    int x, y, time;
};
queue<node>q;
int dirx[] = {1, 0, -1, 0};
int diry[] = {0, 1, 0, -1};
signed main()
{
    //freopen("C:\\Users\\33924\\Downloads\\P2895_14.in", "r", stdin); 
    for (int i = 0; i < 400; i++)
        for (int j = 0; j < 400; j++)
            a[i][j] = INT_MAX;
    cin >> m;
    int x, y, t;
    for (int i = 1; i <= m; i++)
    {

        scanf("%d %d %d", &x, &y, &t);
        for (int k = 0; k < 4; k++)
            if (x + dirx[k] >= 0 && y + diry[k] >= 0)
                a[x + dirx[k]][y + diry[k]] = min(a[x + dirx[k]][y + diry[k]], t);
        a[x][y] = min(a[x][y], t);
    }

    int tx = 0, ty = 0, time = 0;
    q.push({tx, ty, time});
    vis[tx][ty] = true;
    while (!q.empty())
    {
        node f = q.front();
        q.pop();
        if (a[f.x][f.y] == INT_MAX)
        {
            cout << f.time << endl;
            return 0;
        }
        for (int k = 0; k < 4; k++)
        {
            tx = f.x + dirx[k];
            ty = f.y + diry[k];

            if (tx >= 0 && ty >= 0 && tx < 400 && ty < 400 && a[tx][ty] > 0 && a[tx][ty] > f.time + 1 && !vis[tx][ty])
            {
                q.push({tx, ty, f.time + 1});
                vis[tx][ty] = true;
            }
        }
    }
    cout << -1 << endl;
    return 0;
}

by 该不会是aha吧 @ 2022-03-05 12:17:57

@Aeterna 同问


by 该不会是aha吧 @ 2022-03-05 12:23:59

@Aeterna 为啥改成400就过了呀,我310也没有过,理论上比覆盖范围大2个格子应该就够了呀?求解答


by Swiftie_wyc22 @ 2022-03-05 16:29:04

@该不会是aha吧 sorry,这我就不清楚了,反正多开一些更保险


by m1saka @ 2022-03-05 20:09:08

同92,同改成400过了,只能说题目数据范围给得不好


by 该不会是aha吧 @ 2022-03-06 09:20:44

@Aeterna 我知道了,昨天上午刚写这题,下午校选拔赛就出了......开四百就过了的原因是,我们修改了判断是否越界的范围。题目给的流星雨的范围在300,但实际收到影响的范围应该在301,只要把那几个判断的范围改成302,数组开302也是能过的


by Swiftie_wyc22 @ 2022-03-06 20:54:54

@该不会是aha吧 明白了


by Harnue @ 2022-04-09 14:25:20

@该不会是aha吧 啥意思没看懂TwT,我把<=300改成<=301过了,但是应该不会影响结果啊


by 该不会是aha吧 @ 2022-04-10 17:42:11

@Akie_Qs aha,确实301没问题,题目极限就是301,不过我习惯性的,会想要比极限情况多开一点


| 下一页