#3 TLE 求调
查看原帖
#3 TLE 求调
969221
Fryderyk_Chopin楼主2024/5/26 13:53
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1010][1010],vis[1010][1010],x,y,ans=1e8;
int d1[5]={0,1,-1,0,0},d2[5]={0,0,0,1,-1},k=0;
struct pos{
    int x,y,cost;
}l[100010];
queue<pos>s;
bool check1(int x,int y){
    return x>=1 && x<=n && y>=1 && y<=m && !vis[x][y] && a[x][y]!=1 && a[x][y]!=3;
}
void bfs1(int x,int y){
    vis[x][y]=1;
    int ax,ay,ac,bx,by;
    s.push((pos){x,y,0});
    while(!s.empty()){
        ax=s.front().x,ay=s.front().y,ac=s.front().cost;s.pop();
        if(a[ax][ay]==4){
            for(int i=1;i<=k;i++){
                if(l[i].x==ax && l[i].y==ay) l[i].cost=ac;
            }
            continue;
        }
        for(int i=1;i<=4;i++){
            bx=ax+d1[i],by=ay+d2[i];
            if(check1(bx,by)){
                vis[bx][by]=1;
                s.push((pos){bx,by,ac+1});
            }
        }
    }
    return;
}
bool check2(int x,int y){
    return x>=1 && x<=n && y>=1 && y<=m && !vis[x][y] && a[x][y]!=1;
}
void bfs2(int x,int y,int c){
    vis[x][y]=1;
    int ax,ay,ac,bx,by;
    s.push((pos){x,y,c});
    while(!s.empty()){
        ax=s.front().x,ay=s.front().y,ac=s.front().cost;s.pop();
        if(a[ax][ay]==3){
            ans=min(ans,ac);
            return;
        }
        for(int i=1;i<=4;i++){
            bx=ax+d1[i],by=ay+d2[i];
            if(check2(bx,by)){
                vis[bx][by]=1;
                s.push((pos){bx,by,ac+1});
            }
        }
    }
    return;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>m>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(a[i][j]==2) x=i,y=j; 
            if(a[i][j]==4) l[++k]=(pos){i,j,0};
        }
    }
    bfs1(x,y);
    for(int i=1;i<=k;i++){
        if(l[i].cost==0) continue;
        memset(vis,0,sizeof(vis));
        while(!s.empty()) s.pop();
        bfs2(l[i].x,l[i].y,l[i].cost);
    }
    cout<<ans;
    return 0;
}
2024/5/26 13:53
加载中...