Pagini recente » Cod sursa (job #1189326) | Cod sursa (job #303747) | Cod sursa (job #2634288) | Cod sursa (job #513566) | Cod sursa (job #2426746)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
int n, m, nr, l, c, dist[1005][1005], L, C, LF, CF;
char a[1005][1005];
bool viz[1005][1005];
queue <int> ql, qc, qnr;
void reinit() {
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
viz[i][j] = 0;
}
bool bfs(int k) {
ql.push(L);
qc.push(C);
viz[L][C] = true;
while (!ql.empty()) {
l = ql.front(); ql.pop();
c = qc.front(); qc.pop();
if (c == 0 || l == 0 || c > m || l > n)
continue;
if ((a[l + 1][c] == '.' || a[l + 1][c] == 'O') && !viz[l + 1][c] && dist[l + 1][c] >= k) {
ql.push(l + 1);
qc.push(c);
viz[l + 1][c] = true;
}
if ((a[l][c + 1] == '.' || a[l][c + 1] == 'O') && !viz[l][c + 1] && dist[l][c + 1] >= k) {
ql.push(l);
qc.push(c + 1);
viz[l][c + 1] = true;
}
if ((a[l - 1][c] == '.' || a[l - 1][c] == 'O') && !viz[l - 1][c] && dist[l - 1][c] >= k) {
ql.push(l - 1);
qc.push(c);
viz[l - 1][c] = true;
}
if ((a[l][c - 1] == '.' || a[l][c - 1] == 'O') && !viz[l][c - 1] && dist[l][c - 1] >= k) {
ql.push(l);
qc.push(c - 1);
viz[l][c - 1] = true;
}
}
bool ok = viz[LF][CF];
reinit();
return ok;
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
fin >> a[i][j];
if (a[i][j] == 'D') {
ql.push(i);
qc.push(j);
qnr.push(0);
}
if (a[i][j] == 'I') {
L = i, C = j;
}
if (a[i][j] == 'O')
LF = i, CF = j;
}
}
while (!ql.empty()) {
l = ql.front(); ql.pop();
c = qc.front(); qc.pop();
nr = qnr.front(); qnr.pop();
if (l == 0 || c == 0 || l > n || c > m)
continue;
if (dist[l + 1][c] > nr + 1 || dist[l + 1][c] == 0) {
ql.push(l + 1);
qc.push(c);
qnr.push(nr + 1);
dist[l + 1][c] = nr + 1;
}
if (dist[l - 1][c] > nr + 1 || dist[l - 1][c] == 0) {
ql.push(l - 1);
qc.push(c);
qnr.push(nr + 1);
dist[l - 1][c] = nr + 1;
}
if (dist[l][c + 1] > nr + 1 || dist[l][c + 1] == 0) {
ql.push(l);
qc.push(c + 1);
qnr.push(nr + 1);
dist[l][c + 1] = nr + 1;
}
if (dist[l][c - 1] > nr + 1 || dist[l][c - 1] == 0) {
ql.push(l);
qc.push(c - 1);
qnr.push(nr + 1);
dist[l][c - 1] = nr + 1;
}
}
int st = 0, dr = dist[LF][CF], mij, ans = -1;
while (st <= dr) {
mij = (st + dr) / 2;
if (bfs(mij)) {
ans = mij;
st = mij + 1;
}
else dr = mij - 1;
}
fout << ans;
return 0;
}