没用结构体 只能拿35分 求帮助 有注释
查看原帖
没用结构体 只能拿35分 求帮助 有注释
1140800
Hhy0803楼主2024/1/18 17:19
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define lop(i,a,b) for(int i=(a);i<(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define el '\n' 
typedef pair<int,int> PII;
using LL = long long;
const int INF=0x3f3f3f3f;
const int N=400;
int t[N][N],d[N][N];//t数组存流星最早抵达的时间,d数组存到达某个点的时间,分别初始化为无穷和-1
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int n;
int bfs()
{
    memset(d,-1,sizeof(d));
    queue<PII>q;
    q.push({0,0});
    d[0][0]=0;
    while(q.size())
    {
        auto p=q.front();
        q.pop();
        if(t[p.first][p.second]==INF)return d[p.first][p.second];//如果这个点的陨石时间为正无穷则是安全的 直接return
        lop(i,0,4)
        {
            int x=p.first+dx[i],y=p.second+dy[i];
            if(x>=0&&y>=0&&d[x][y]==-1&&t[x][y]>d[p.first][p.second]+1)//坐标大于等于0且没去过且陨石掉落的时间比到达时间大
            {
                d[x][y]=d[p.first][p.second]+1;
                q.push({x,y});
            }
        }
    }
    return -1;
}
void solve()
{
    memset(t,0x3f,sizeof(t));
    cin>>n;
    lop(i,0,n)
    {
        int x,y,T;
        cin>>x>>y>>T;
        t[x][y]=min(t[x][y],T);
        lop(i,0,4)
        {
            int a=x+dx[i],b=y+dy[i];
            if(a>=0&&b>=0)
                t[a][b]=min(t[a][b],t[x][y]);
        }
    }
    cout<<bfs()<<el;
}
int main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int tt = 1;
    //cin>>tt;
    while(tt--)
      solve();
    return 0;
}
2024/1/18 17:19
加载中...