Pagini recente » Cod sursa (job #724698) | Cod sursa (job #2676836) | Cod sursa (job #844985) | Cod sursa (job #1046076) | Cod sursa (job #2524536)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 666013;
const int N = 1005;
ifstream in("barbar.in");
ofstream out("barbar.out");
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
vector < pair < int, int > > initial_dragons;
pair < int, int > startp;
pair < int, int > endp;
int precalc_matrix[N][N], n, m, mx = 0;
bool matrix[N][N];
bool ok1(int x, int y) {
if (x < 1 || y < 1 || x > n || y > m) {
return false;
}
if (precalc_matrix[x][y] != 0) {
return false;
}
return true;
}
bool ok(int x, int y) {
if (x < 1 || y < 1 || x > n || y > m) {
return false;
}
if (precalc_matrix[x][y] == -1) {
return false;
}
if (matrix[x][y] == 1) {
return false;
}
return true;
}
void set_bfs(vector < pair < int, int > > &v) {
queue < pair < int, int > > q;
for (auto it : v) {
q.push({it.first, it.second});
}
while(!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int d = 0; d < 4; d++) {
if (ok1(x + dx[d], y + dy[d])) {
q.push({x + dx[d], y + dy[d]});
if (precalc_matrix[x][y] == -1) {
precalc_matrix[x + dx[d]][y + dy[d]] = 1;
mx = max(mx, precalc_matrix[x + dx[d]][y + dy[d]]);
}
else {
precalc_matrix[x + dx[d]][y + dy[d]] = precalc_matrix[x][y] + 1;
mx = max(mx, precalc_matrix[x + dx[d]][y + dy[d]]);
}
}
}
}
}
bool bfs(int target_value) {
queue < pair < int, int > > q;
memset(matrix, 0, sizeof(matrix));
q.push({startp.first, startp.second});
while(q.size()) {
int x = q.front().first;
int y = q.front().second;
matrix[x][y] = 1;
q.pop();
for (int d = 0; d < 4; d++) {
if (ok(x + dx[d], y + dy[d]) && precalc_matrix[x + dx[d]][y + dy[d]] >= target_value) {
q.push({x + dx[d], y + dy[d]});
}
}
}
if (matrix[endp.first][endp.second] == 1) {
return true;
}
return false;
}
int main() {
in >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
char c;
in >> c;
if (c == 'I') {
startp = {i, j};
}
if (c == 'O') {
endp = {i, j};
}
if (c == 'D') {
precalc_matrix[i][j] = -1;
initial_dragons.push_back({i, j});
}
}
}
set_bfs(initial_dragons);
int l = 1, r = mx, ans = -1;
while(l <= r) {
int mid = (l + r) / 2;
if (bfs(mid)) {
ans = mid;
l = mid + 1;
}
else {
r = mid - 1;
}
}
out << ans << "\n";
return 0;
}