제출 #972886

#제출 시각아이디문제언어결과실행 시간메모리
972886jadai007Mecho (IOI09_mecho)C++17
3 / 100
579 ms7108 KiB
#include<bits/stdc++.h> using namespace std; int n,s, bee[808][808], xx[] = {0, 0, -1, 1}, xy[] = {-1, 1, 0, 0}, bear[808][808], ans; char mp[808][808]; pair<int, int> start, en; queue<tuple<int, int, int>> q; bool solve(int mid){ for(int i = 1; i<=n; ++i) for(int j = 1; j<=n; ++j) bee[i][j] = bear[i][j] = 1e9; for(int i = 1; i<=n; ++i){ for(int j = 1; j<=n; ++j){ if(mp[i][j] == 'H'){ bee[i][j] = 0; q.emplace(i, j, 0); } } } while(!q.empty()){ int x = get<0>(q.front()), y = get<1>(q.front()), w = get<2>(q.front()); q.pop(); for(int i = 0; i<4; ++i){ int nx = x + xx[i]; int ny = y + xy[i]; if(nx < 1 || n < 1 || nx > n || ny > n || mp[nx][ny] == 'T') continue; if(bee[nx][ny] > w + 1){ bee[nx][ny] = w + 1; q.emplace(nx, ny, w + 1); } } } bear[start.first][start.second] = mid; q.emplace(start.first, start.second, mid); while(!q.empty()){ int x = get<0>(q.front()), y = get<1>(q.front()), w = get<2>(q.front()); q.pop(); if(x == en.first && y == en.second) return true; for(int i = 0; i<4; ++i){ int nx = x + xx[i]; int ny = y + xy[i]; if(nx < 1 || ny < 1 || nx > n || ny > n || mp[nx][ny] == 'T') continue; if(bear[nx][ny] > w + 1){ int times = ((w + 1) / s) + ((w + 1) % s != 0); if(bee[nx][ny] <= times) continue; bear[nx][ny] = w + 1; q.emplace(nx, ny, w+1); } } } return false; } int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n >> s; for(int i = 1; i<=n; ++i){ for(int j = 1; j<=n; ++j){ cin >> mp[i][j]; if(mp[i][j] == 'M') start = {i, j}; else if(mp[i][j] == 'D') en = {i, j}; } } int l = 1, r = 1e9; while(l < r){ int mid = (l + r) >> 1; //cout << mid << ' '; if(solve(mid)){ ans = mid; l = mid + 1; } else r = mid - 1; } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...