Pagini recente » Cod sursa (job #170176) | Cod sursa (job #2386083) | Cod sursa (job #173203) | Cod sursa (job #1723564) | Cod sursa (job #2138836)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int N = 1001, di[] = {-1,0,1,0}, dj[] = {0,1,0,-1};
int n, m, dist[N][N], x1, y1, x2, y2, viz[N][N];
char a[N][N];
inline bool inbounds(int i, int j) {
return (i >= 0 && i < n && j >= 0 && j < n);
}
void precalculare_lee(int i, int j, int val) {
if (!inbounds(i, j) || val >= dist[i][j] || a[i][j] == '*') return;
dist[i][j] = min(dist[i][j], val);
for (int k = 0; k < 4; k++) {
precalculare_lee(i + di[k], j + dj[k], val + 1);
}
return;
}
bool lee(int i, int j, int d) {
if (i == x2 && j == y2) return true;
if (!inbounds(i, j) || dist[i][j] < d || viz[i][j] == d || a[i][j] == '*') return false;
bool atins = false;
viz[i][j] = d;
for (int k = 0; k < 4; k++) if (!atins) atins = lee(i + di[k], j + dj[k], d);
return atins;
}
void cautbin() {
int r = 0, pas = 1 << 20;
while (pas != 0) {
if (r + pas <= n && lee(x1, y1, r + pas)) {
r += pas;
}
pas >>= 1;
}
if (r == 0) out << -1;
else out << r;
out.close();
}
int main()
{
in >> n >> m;
for (int i = 0; i < n; i++) {
in >> a[i];
for (int j = 0; j < m; j++) dist[i][j] = 1001;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == 'D') {
precalculare_lee(i, j, 0);
}
if (a[i][j] == 'I') {
x1 = i;
y1 = j;
}
if (a[i][j] == 'O') {
x2 = i;
y2 = j;
}
}
}
cautbin();
//for (int i = 0; i < n; i++) {
// for (int j = 0; j < m; j++) out << dist[i][j] << ' ';
// out << '\n';
//}
}