牛客月赛100 D题,过了80%数据,调了一下午。。。烦死了。。。

还是没调试出来,别人的代码用5维的距离的更新有滞后性,要在遍历之前要去重。。。

#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10;
char g[N][N];
int dis[N][N],d1[N][N];
int n,m,sx,sy;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
typedef pair<int,int>PII;
queue<PII>q;
int bfs()
{
    while(q.size())
    {
        auto [x,y]=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int a=x+dx[i],b=y+dy[i];
            if(a<1||a>n||b<1||b>m)continue;
            if(dis[a][b]!=-1)continue;
            dis[a][b]=dis[x][y]+1;
            q.push({a,b});
        }
    }
    int ans=0x3f3f3f3f;
    memset(d1,-1,sizeof d1);
    queue<array<int,4>>p;
    p.push({sx,sy,sx,sy});
    d1[sx][sy]=0;
    while(p.size())
    {
        auto[x1,y1,x2,y2]=p.front();
        p.pop();
        for(int i=0;i<4;i++)
        {
            int a=x1+dx[i],b=y1+dy[i];
            int c=x2-dx[i],d=y2-dy[i];
            if(a<1||a>n||b<1||b>m||c<1||c>n||d<1||d>m)continue;
            if(g[a][b]=='#'||g[c][d]=='#')continue;
            if(d1[a][b]!=-1)continue;
            d1[a][b]=d1[x1][y1]+1;
            if(g[a][b]=='@')ans=min(ans,d1[a][b]+dis[c][d]);
            p.push({a,b,c,d});
        }
    }
    if(ans!=0x3f3f3f3f)return ans;
    return -1;
}
int main()
{
    memset(dis,-1,sizeof dis);
    cin>>n>>m>>sx>>sy;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
            if(g[i][j]=='@'){
                q.push({i,j});
                dis[i][j]=0;
            }
        }
    }
    cout<<bfs()<<endl;
//     for(int i=1;i<=n;i++){
//         for(int j=1;j<=m;j++){
//             cout<<dis[i][j];
//         }
//         puts("");
//     }   
//     puts("");
//     for(int i=1;i<=n;i++){
//         for(int j=1;j<=m;j++){
//             cout<<d1[i][j];
//         }
//         puts("");
//     }   
    return 0;
}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部