Submission #1288971

#TimeUsernameProblemLanguageResultExecution timeMemory
1288971abhi_atgMecho (IOI09_mecho)C++20
100 / 100
143 ms12012 KiB
// Jai Shree Ram
#include<bits/stdc++.h>
using namespace std;
/* Abhi-Atg */
#define array int n;cin >> n;vector<long long> v(n);f(i,0,n)cin >> v[i];
#define out(_) for (auto &it :_){cout << it << " " ;}cout<<endl;
#define f(i,l,r) for(int i=l;i<r;i++)
#define ff(i,r,l) for(int i=r;i>=l;i--)
#define pb push_back
#define mod 1000000007
#define INDIA 998244353
#define ll long long 
#define all(v) v.begin(),v.end()
#define dbg cout << "Bharat\n"
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define minus cout << "-1\n"

void solve(){
    int n,s;cin >> n >> s;
    vector<string> v(n);
    int mx,my;
    int dx,dy;
    vector<pair<int,int>> q;
    vector<vector<int>> dp(n,vector<int>(n, INDIA));
    f(i,0,n){
        cin >> v[i];
        for(int j=0;j<n;j++){
            if(v[i][j]=='M'){
                mx=i;my=j;
            }else if(v[i][j]=='D'){
                dx=i;dy=j;
            }else if(v[i][j]=='H'){
                q.pb({i,j});
                dp[i][j]=0;
            }
        }
    }
    int xx[]={0,0,1,-1};
    int yy[]={1,-1,0,0};
    for(int i=0;i<q.size();i++){
        for(int j=0;j<4;j++){
            int nx=q[i].first+xx[j];
            int ny=q[i].second+yy[j];
            if(nx>=0 && ny>=0 && nx<n && ny<n && v[nx][ny]!='T' && v[nx][ny]!='D' && dp[nx][ny]>dp[q[i].first][q[i].second]+1){
                dp[nx][ny]=dp[q[i].first][q[i].second]+1;
                q.pb({nx,ny});
            }
        }
    }
    int mn=-1;
    int l=0,r=INDIA;
    while(l<=r){
        int mid=(l+r)/2;
        bool flag=false;
        int val=mid;
        if(dp[mx][my]>val){
            vector<pair<int,int>> q;
            q.push_back({mx,my});
            vector<vector<bool>> vis(n,vector<bool>(n,false));
            vis[mx][my]=true;
            while(q.size()){
                val++;
                for(int st=0;st<s;st++){
                    vector<pair<int,int>> qq;
                    for(int i=0;i<q.size();i++){
                        for(int j=0;j<4;j++){
                            int nx=q[i].first+xx[j];
                            int ny=q[i].second+yy[j];
                            if(nx>=0 && ny>=0 && nx<n && ny<n && v[nx][ny]!='T' && vis[nx][ny]==false){
                                int cond=0;
                                if(st==s-1){
                                    cond=(dp[nx][ny]>val);
                                }else{
                                    cond=(dp[nx][ny]>=val);
                                }
                                if(cond){
                                    vis[nx][ny]=true;
                                    qq.pb({nx,ny});
                                    if(nx==dx && ny==dy){
                                        flag=true;
                                        break;
                                    }
                                }
                            }
                        }
                        if(flag)break;
                    }
                    q=qq;
                }
            }
        }
        if(flag){
            mn=mid;
            l=mid+1;
        }else r=mid-1;
    }
    cout << mn << "\n";
}


int main(){

    ios_base::sync_with_stdio(false);cin.tie(nullptr);
    // #ifndef ONLINE_JUDGE
    //     freopen("input.txt", "r", stdin);
    //     freopen("output.txt", "w", stdout);
    // #endif

    // freopen("input.in", "r", stdin);
    // freopen("output.out", "w", stdout);

    int t=1;
    // cin >> t;
    for(int _=1;_<=t;_++){
        // cout<<"Case #"<<_<<": ";
        solve();
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...