倒数5个全是MLE,请问是怎么回事呢

P2895 [USACO08FEB] Meteor Shower S

Lianyike1314 @ 2024-07-29 20:21:51

#include<bits/stdc++.h>

using namespace std;

const int N = 310;
int m;
int death[N][N],ans[N][N];//death是记录要被砸中的时间,ans是到这个位置的花的时间
int op[N][N];//op:是记录是否走过
int dx[5] = {0 , 0,  -1, 1}, dy[5] = {1, -1, 0, 0};
queue<pair<int,int>> q;

int main()
{
    //读取数据并且得到所有可能被砸对应的时间图
    cin >> m;
    memset(death, -1,sizeof death);
    for(int i = 0; i < m; i++)
    {
        int x,y,t;
        cin>>x>>y>>t;
        if(t<death[x][y]||death[x][y]==-1) //这颗流星到达的时间必须小于前面流星或焦土到达的时间,或者还暂时没有流星及焦土
            death[x][y]=t;
        for(int i=0; i<4; i++)
        {
            int nx=x+dx[i],ny=y+dy[i];
            if(nx>=0&&ny>=0&&(death[nx][ny]==-1||t<death[nx][ny]))
                death[nx][ny]=t;  //枚举焦土
        }
    }

    op[0][0] = 1;
    if(death[0][0] == -1)
    {
        printf("0");
        return 0;
    }
    //开始做节点
    q.push({0,0});
    while(!q.empty())
    {
        auto t = q.front();
        q.pop();
        for(int i = 0; i < 4; i++)
        {
            int x = t.first + dx[i], y = t.second + dy[i];

            if(x >= 0 && y>= 0 && !op[x][y] && (ans[t.first][t.second] + 1 < death[x][y] || death[x][y] == -1))//满足条件且到该点时没有死亡
            {
                    ans[x][y] = ans[t.first][t.second] + 1;
                    if(death[x][y] == -1)
                    {
                        printf("%d",ans[x][y]);
                        return 0;
                    }
                    q.push({x,y});
                    op[x][y] == 1;

            }
        }
    }
    printf("-1");
    return 0;
}

by Lianyike1314 @ 2024-07-29 20:22:59

主要是我感觉我和有个题解写得蛮像的,不知道为什么就是过不了


|