제출 #1156146

#제출 시각아이디문제언어결과실행 시간메모리
1156146irmuunMaze (JOI23_ho_t3)C++20
0 / 100
0 ms332 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

ll r,c,n;
ll sr,sc;
ll gr,gc;

vector<vector<ll>>g,dist;
vector<vector<char>>s;
vector<ll>adj,ans;

vector<ll>dx={0,0,-1,1};
vector<ll>dy={-1,1,0,0};

ll G=0;//group number

void dfs(ll x,ll y){
    for(ll k=0;k<4;k++){
        ll nx=x+dx[k],ny=y+dy[k];
        if(nx<1||ny<1||nx>r||ny>c||s[nx][ny]=='#'||g[nx][ny]!=0) continue;
        g[nx][ny]=G;
        dfs(nx,ny);
    }
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>r>>c>>n;
    cin>>sr>>sc;
    cin>>gr>>gc;
    s.resize(r+1);
    for(ll i=1;i<=r;i++){
        s[i].resize(c+1);
        for(ll j=1;j<=c;j++){
            cin>>s[i][j];
        }
    }
    g.resize(r+1);
    for(ll i=1;i<=r;i++){
        g[i].resize(c+1);
        for(ll j=1;j<=c;j++){
            if(g[i][j]==0&&s[i][j]=='.'){
                G++;
                g[i][j]=G;
                dfs(i,j);
            }
        }
    }
    ans.resize(G+1);
    fill(all(ans),1e9);
    dist.resize(G+1);
    for(ll i=1;i<=G;i++){
        dist[i].resize(G+1);
        fill(all(dist[i]),1e9);
    }
    for(ll i=1;i<=r;i++){
        for(ll j=1;j<=c;j++){
            for(ll x=1;x<=r;x++){
                for(ll y=1;y<=c;y++){
                    if(g[i][j]==0||g[x][y]==0||g[i][j]==g[x][y]) continue;
                    ll g1=min(g[i][j],g[x][y]),g2=max(g[i][j],g[x][y]);
                    ll need=max(abs(i-x)-1,abs(j-y)-1);
                    need=(need+n-1)/n;
                    dist[g1][g2]=min(dist[g1][g2],need);
                    dist[g2][g1]=min(dist[g2][g1],need);
                }
            }
        }
    }
    ans[g[sr][sc]]=0;
    set<array<ll,2>>q;
    q.insert({0,g[sr][sc]});
    while(!q.empty()){
        auto [L,x]=*q.begin();
        q.erase(q.begin());
        if(ans[x]!=L) continue;
        for(ll y=1;y<=G;y++){
            if(ans[x]+dist[x][y]<ans[y]){
                ans[y]=ans[x]+dist[x][y];
                q.insert({ans[y],y});
            }
        }
    }
    cout<<ans[g[gr][gc]];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...