제출 #391410

#제출 시각아이디문제언어결과실행 시간메모리
391410ml1234Mecho (IOI09_mecho)C++17
68 / 100
299 ms6780 KiB
#include <iostream> #include <string> #include <queue> using namespace std; bool validmecho(int i, int j); bool validbees(int i, int j); bool bfs(int starttime); string grid[800]; int bees[800][800]; int dx[] = {0, -1, 1, 0}, dy[] = {-1, 0, 0, 1}; int n, s; pair<int, int> mecho; int main() { cin >> n >> s; for (int i = 0; i < n; i++) { cin >> grid[i]; for (int j = 0; j < n; j++) { if (grid[i][j] == 'M') { mecho = {i, j}; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { bees[i][j] = 1e9; } } queue<pair<int, int>> q; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (grid[i][j] == 'H') { q.push({i, j}); bees[i][j] = 0; } } } while (!q.empty()) { int curri = q.front().first, currj = q.front().second; q.pop(); for (int d = 0; d < 4; d++) { int nexti = curri + dx[d], nextj = currj + dy[d]; if (validbees(nexti, nextj) && bees[nexti][nextj] > bees[curri][currj] + s) { bees[nexti][nextj] = bees[curri][currj] + s; q.push({nexti, nextj}); } } } int low = 0, high = n * n; while (low < high) { int mid = (low + high + 1) / 2; if (bfs(mid)) { low = mid; } else { high = mid - 1; } } cout << low << endl; return 0; } bool ongrid(int i, int j) { return (i >= 0 && i < n && j >= 0 && j < n); } bool validbees(int i, int j) { return (ongrid(i, j) && !(grid[i][j] == 'T') && !(grid[i][j] == 'D') && !(grid[i][j] == 'H')); } bool validmecho(int i, int j) { return (ongrid(i, j) && !(grid[i][j] == 'T')); } bool bfs(int starttime) { queue<pair<int, int>> q; q.push(mecho); vector<vector<int>> mechodist(n, vector<int> (n, -1)); mechodist[mecho.first][mecho.second] = starttime * s; while (!q.empty()) { int curri = q.front().first, currj = q.front().second; q.pop(); if (grid[curri][currj] == 'D') { return true; } for (int d = 0; d < 4; d++) { int nexti = curri + dx[d], nextj = currj + dy[d]; if (!validmecho(nexti, nextj)) { continue; } if (mechodist[nexti][nextj] == -1) { if (bees[nexti][nextj] > mechodist[curri][currj] + 1) { mechodist[nexti][nextj] = mechodist[curri][currj] + 1; q.push({nexti, nextj}); } } } } return false; }
#Verdict Execution timeMemoryGrader output
Fetching results...