Pagini recente » Cod sursa (job #470580) | Cod sursa (job #425654) | Cod sursa (job #1145081) | Cod sursa (job #1910357) | Cod sursa (job #2525022)
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
ifstream in("barbar.in");
ofstream out("barbar.out");
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
queue < pair < int, int > > Dragons;
bool isDragon[N][N];
int matrix[N][N], viz[N][N];
pair < int, int > stp, enp;
int n, m;
bool ok(int x, int y) {
if (isDragon[x][y]) {
return false;
}
if (x < 1 || y < 1 || x > n || y > m) {
return false;
}
if (matrix[x][y] != 0) {
return false;
}
return true;
}
bool ok1(int x, int y) {
if (x < 1 || y < 1 || x > n || y > m) {
return false;
}
return true;
}
void set_bfs() {
while(Dragons.size()) {
int x = Dragons.front().first;
int y = Dragons.front().second;
Dragons.pop();
for (int d = 0; d < 4; d++) {
int new_x = x + dx[d];
int new_y = y + dy[d];
if (ok(new_x, new_y)) {
Dragons.push(make_pair(new_x, new_y));
matrix[new_x][new_y] = matrix[x][y] + 1;
}
}
}
}
bool bfs(int target, int put) {
if (matrix[stp.first][stp.second] < target) {
return false;
}
queue < pair < int, int > > q;
q.push(make_pair(stp.first, stp.second));
while(q.size()) {
int x = q.front().first;
int y = q.front().second;
viz[x][y] = put;
q.pop();
for (int d = 0; d < 4; d++) {
int new_x = x + dx[d];
int new_y = y + dy[d];
if (ok1(new_x, new_y) && viz[new_x][new_y] != put && matrix[new_x][new_y] >= target) {
q.push(make_pair(new_x, new_y));
}
}
}
if (viz[enp.first][enp.second] == put) {
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') {
stp = make_pair(i, j);
}
if (c == 'O') {
enp = make_pair(i, j);
}
if (c == '*') {
matrix[i][j] = -1;
}
if (c == 'D') {
Dragons.push(make_pair(i, j));
isDragon[i][j] = 1;
}
}
}
set_bfs();
int l = 0, r = 2020, ans = -1, f = 0;
while(l <= r) {
int mid = (l + r) / 2;
f++;
if (bfs(mid, f)) {
ans = mid;
l = mid + 1;
}
else {
r = mid - 1;
}
}
out << ans << "\n";
}