제출 #1237840

#제출 시각아이디문제언어결과실행 시간메모리
1237840GabrielMecho (IOI09_mecho)C++20
100 / 100
158 ms4088 KiB
#include "bits/stdc++.h" using namespace std; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, s; cin>>n>>s; vector<string> Bosque(n); pair<int, int> Inicio, Casa; deque< pair< pair<int, int>, int> > Cola; for(int i = 0; i < n; i++){ cin>>Bosque[i]; for(int j = 0; j < n; j++){ if(Bosque[i][j] == 'D') Casa = {i, j}; if(Bosque[i][j] == 'M') Inicio = {i, j}; if(Bosque[i][j] == 'H') Cola.push_back({{i, j}, 0}); } } vector< vector<int> > Distancia(n, vector<int>(n, INT_MAX)); for(auto E: Cola) Distancia[E.first.first][E.first.second] = -0; vector<int> ci = {0, 1, 0, -1}, cj = {1, 0, -1, 0}; while(!Cola.empty()){ pair< pair<int, int>, int> Actual = Cola[0]; Cola.pop_front(); if(Distancia[Actual.first.first][Actual.first.second] < Actual.second) continue; pair<int, int> Nodo = Actual.first; for(int i = 0; i < 4; i++){ int ni = Nodo.first + ci[i], nj = Nodo.second + cj[i]; if(ni > -1 and ni < n and nj > -1 and nj < n and Distancia[ni][nj] > Distancia[Nodo.first][Nodo.second] + 1 and Bosque[ni][nj] != 'T' and Bosque[ni][nj] != 'D' and Bosque[ni][nj] != 'H'){ Distancia[ni][nj] = Distancia[Nodo.first][Nodo.second] + 1; Cola.push_back({{ni, nj}, Distancia[ni][nj]}); } } } /*for(auto E: Distancia){ for(auto e: E) cerr<<e<<" "; cerr<<"\n"; }*/ int i = 0, d = n * n + 1, m = 0; while(1){ int p = (i + d) / 2; vector< vector<bool> > Visitados(n, vector<bool>(n, 0)); Cola = {{Inicio, p * s}}; bool Bien = 0; while(!Cola.empty()){ pair< pair<int, int>, int> Actual = Cola[0]; pair<int, int> Nodo = Actual.first; Cola.pop_front(); if(Nodo == Casa){ Bien = 1; break; } /*for(auto E: Visitados){ for(auto e: E) cerr<<e<<" "; cerr<<"\n"; } cerr<<"----\n";*/ //cerr<<Nodo.first<<" "<<Nodo.second<<" "<<Actual.second / s<<" "<<p<<" "<<Distancia[Nodo.first][Nodo.second]<<"\n"; if(Actual.second / s >= Distancia[Nodo.first][Nodo.second] or Visitados[Nodo.first][Nodo.second]) continue; /*for(auto E: Visitados){ for(auto e: E) cerr<<e<<" "; cerr<<"\n"; } cerr<<"----\n";*/ for(int i = 0; i < 4; i++){ int ni = Nodo.first + ci[i], nj = Nodo.second + cj[i]; if(ni > -1 and ni < n and nj > -1 and nj < n and !Visitados[ni][nj] and Bosque[ni][nj] != 'T' and Bosque[ni][nj] != 'H'){ Cola.push_back({{ni, nj}, Actual.second + 1}); } } Visitados[Nodo.first][Nodo.second] = 1; } //cerr<<"Fin.\n----\n"; if(Bien){ m = p; i = p + 1; } else { if(p == 0) m = -1; d = p - 1; } if(i >= d + 1) break; } cout<<m; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...