Nu exista pagina, dar poti sa o creezi ...
Cod sursa(job #2935580)
Utilizator | Data | 6 noiembrie 2022 23:32:49 | |
---|---|---|---|
Problema | Barbar | Scor | 70 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1.87 kb |
#include <bits/stdc++.h>
using namespace std;
#define NMAX 1005
#define INF 0x3f3f3f3f
const int dx[] {-1, 1, 0, 0},
dy[] {0, 0, -1, 1};
int main() {
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m;
fin >> n >> m;
int dist[NMAX][NMAX];
memset(dist, 0x37, sizeof(dist));
pair<int, int> src, dst;
queue<pair<int, int>> q;
char a[NMAX][NMAX];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
fin >> a[i][j];
if (a[i][j] == 'D') {
q.push({i, j});
dist[i][j] = 0;
} else if (a[i][j] == 'I')
src = {i, j};
else if (a[i][j] == 'O')
dst = {i, j};
}
for (int i = 1; i <= n; ++i)
a[i][0] = a[i][m + 1] = '*';
for (int i = 1; i <= m; ++i)
a[0][i] = a[n + 1][i] = '*';
bool visited[NMAX][NMAX] {};
int dist_max = INT_MIN;
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
if (visited[x][y])
continue;
visited[x][y] = true;
for (int d = 0; d < 4; ++d) {
const int new_x = x + dx[d], new_y = y + dy[d];
if (a[new_x][new_y] != '*' && !visited[new_x][new_y]) {
dist[new_x][new_y] = dist[x][y] + 1;
dist_max = max(dist[new_x][new_y], dist_max);
q.push({new_x, new_y});
}
}
}
auto check = [&](int val) {
memset(visited, 0, sizeof(visited));
queue<pair<int, int>> q;
q.push(src);
while (!q.empty()) {
if (q.front() == dst)
return true;
auto [x, y] = q.front();
q.pop();
if (visited[x][y])
continue;
visited[x][y] = true;
for (int d = 0; d < 4; ++d) {
const int new_x = x + dx[d], new_y = y + dy[d];
if (a[new_x][new_y] != '*' && !visited[new_x][new_y] && dist[new_x][new_y] >= val)
q.push({new_x, new_y});
}
}
return false;
};
int val, step;
for (step = 1; step <= dist_max; step <<= 1);
for (val = 0; step; step >>= 1)
if (val + step <= dist_max && check(val + step))
val += step;
fout << val ? val : -1 << '\n';
}