Submission #1083312

#TimeUsernameProblemLanguageResultExecution timeMemory
1083312hohemheinMecho (IOI09_mecho)C++17
35 / 100
39 ms12380 KiB
#include <bits/stdc++.h>
#define ii pair<int,int>
#define iii pair<ii,int>
#define iiii pair<ii,ii>
#define f first
#define s second
#define pb push_back
#define pu push
#define ll long long
#define int long long
#define endl "\n"
#define all(x) (x).begin() , (x).end()
using namespace std;
const int nmax = 8e2+4;
const int oo = 1e12+3;
const ll mod = 1e9+7;

char m[nmax][nmax];
int bee[nmax][nmax];
int bear[nmax][nmax];

int mov[] = { 1,-1 };


void llenar(){

   for( int i = 0; i < nmax; i++ ){
    fill( bear[i], bear[i]+nmax, oo );
    fill( bee[i], bee[i]+nmax, oo );
   }

}

void bfsBee( vector<ii>&aux, int n ){
  queue<ii>c;
  for( auto [i,j] : aux ){
        c.pu({i,j});
        bee[i][j] = 0;
  }

  while( !c.empty() ){
     auto [x,y] = c.front();
     c.pop();

     for( int i = 0; i < 2; i++ )
        if( x+mov[i] > 0 && x+mov[i] <= n && m[ x+mov[i] ][y] == 'G' && bee[ x+mov[i] ][y] == oo ){
           c.pu( {x+mov[i],y} );
           bee[ x+mov[i] ][y] = bee[x][y]+1;
     }

     for( int i = 0; i < 2; i++ )
        if( y+mov[i] > 0 && y+mov[i] <= n && m[x][y+mov[i]] == 'G' && bee[x][y+mov[i]] == oo ){
           c.pu( {x,y+mov[i]} );
           bee[x][y+mov[i]] = bee[x][y]+1;
     }


  }

}


void bfsBear( ii X, int n, int k ){
  queue<iii>c;
  c.pu({{X.f,X.s},0});
  bear[X.f][X.s] = bee[X.f][X.s] -1;

  while( !c.empty() ){
     auto [x,y] = c.front().f; int pe = c.front().s;
     c.pop();
     for( int i = 0; i < 2; i++ )
        if( x+mov[i] > 0 && x+mov[i] <= n && m[ x+mov[i] ][y] != 'T' && bear[ x+mov[i] ][y] == oo && bee[ x+mov[i] ][y] > pe/k ){
           c.pu( { {x+mov[i],y}, pe+1 } );
           bear[ x+mov[i] ][y] = min( bear[x][y] , bee[ x+mov[i] ][y] - pe/k - 1 );
     }

     for( int i = 0; i < 2; i++ )
        if( y+mov[i] > 0 && y+mov[i] <= n && m[x][y+mov[i]] != 'T'&& bear[x][y+mov[i]] == oo && bee[x][y+mov[i]] > pe/k ){
           c.pu( {{x,y+mov[i]},pe+1} );
           bear[x][y+mov[i]] =  min( bear[x][y] , bee[x][y+mov[i]] - pe/k - 1 );
     }


  }

}



int32_t main()
{
    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie();
    //cout << fixed << setprecision(4);

    /*ifstream cin ("atlarge.in");
    ofstream cout ("atlarge.out");*/


    llenar();

    int n, k; cin >> n >> k;
    ii init, meta;

    vector<ii>aux;

    for( int i = 1; i <= n; i++ )
        for( int j = 1; j <= n; j++ ){
            cin >> m[i][j];
            if( m[i][j] == 'H' )aux.pb({i,j});
            else if( m[i][j] == 'M' )init = {i,j};
            else if( m[i][j] == 'D' )meta = {i,j};
        }
     m[init.f][init.s] = 'G';
     bfsBee( aux, n );

     bfsBear( init, n, k);

     if( bear[meta.f][meta.s] != oo )cout << bear[meta.f][meta.s];
     else cout <<"-1\n";

    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...