Pagini recente » Cod sursa (job #1207723) | Cod sursa (job #1968183) | Cod sursa (job #2141585) | Cod sursa (job #2690238) | Cod sursa (job #2703573)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, startx, starty, sfx, sfy, mt[1005][1005], mt2[1005][1005], dist[1005][1005];
int ox[] = {-1, 0, 1, 0}, oy[] = {0, 1, 0, -1};
bool block[1005][1005];
queue < pair <int, int> > q;
void readInput() {
fin >> n >> m;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
char el;
fin >> el;
if (el == 'D') {
block[i][j] = true;
q.push({i, j});
}
if (el == '*')
mt2[i][j] = -1;
if (el == 'I')
startx = i, starty = j;
if (el == 'O')
sfx = i, sfy = j;
}
return;
}
void leeDragoni() {
while (!q.empty()) {
int x = q.front().first, y = q.front().second;
q.pop();
for (int i = 0; i < 4; ++i) {
int a = x + ox[i], b = y + oy[i];
if (!block[a][b] && mt[a][b] == 0 && a >= 1 && a <= n && b <= m && b >= 1 && dist[a][b] == 0) {
dist[a][b] = dist[x][y] + 1;
q.push({a, b});
}
}
}
return;
}
void lee(int minDist) {
while (!q.empty())
q.pop();
q.push({startx, starty});
mt[startx][starty] = dist[startx][starty];
if (mt[startx][starty] < minDist)
return;
while (!q.empty()) {
int x = q.front().first, y = q.front().second;
q.pop();
for (int i = 0; i < 4; ++i) {
int a = x + ox[i], b = y + oy[i];
if (mt[a][b] == 0 && min(mt[x][y], dist[a][b]) >= minDist) {
mt[a][b] = min(mt[x][y], dist[a][b]);
q.push({a, b});
}
}
}
return;
}
int main() {
readInput();
leeDragoni();
int st = 1, dr = 2000;
while (st <= dr) {
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
mt[i][j] = mt2[i][j];
int mij = (st + dr) / 2;
lee(mij);
if (mt[sfx][sfy] != 0)
st = mij + 1;
else
dr = mij - 1;
}
fout << st - 1;
return 0;
}