Pagini recente » Cod sursa (job #73231) | Cod sursa (job #1498757) | Cod sursa (job #2264937) | Cod sursa (job #2877475) | Cod sursa (job #3242528)
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
ifstream fin("input.txt");
#define fout cout
#else
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#endif
#define fi first
#define se second
#define sz(a) int((a).size())
#define all(a) (a).begin(), (a).end()
using ll = long long;
using pii = pair<int, int>;
const int NMAX = 1005;
const int INF = 1e9+5;
const int dx[] = { 1, -1, 0, 0 };
const int dy[] = { 0, 0, 1, -1 };
int n, m;
int sx, sy;
int tx, ty;
char a[NMAX][NMAX];
int dd[NMAX][NMAX];
int dist[NMAX][NMAX];
void read() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> (a[i] + 1);
}
}
bool good(int min_dist) {
for (int i = 1; i <= n; i++) {
fill(dist[i] + 1, dist[i] + m + 1, INF);
}
queue<pii> q;
q.push({ sx, sy });
dist[sx][sy] = 0;
while (!q.empty()) {
auto [ x, y ] = q.front();
q.pop();
if (x == tx && y == ty) {
return true;
}
for (int k = 0; k < 4; k++) {
if (a[x + dx[k]][y + dy[k]] == '.' &&
dd[x + dx[k]][y + dy[k]] >= min_dist &&
dist[x + dx[k]][y + dy[k]] > dist[x][y] + 1
) {
dist[x + dx[k]][y + dy[k]] = dist[x][y] + 1;
q.push({ x + dx[k], y + dy[k] });
}
}
}
return false;
}
int solve() {
queue<pii> q;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dd[i][j] = INF;
if (a[i][j] == 'D') {
q.push({ i, j });
dd[i][j] = 0;
} else if (a[i][j] == 'I') {
sx = i;
sy = j;
a[i][j] = '.';
} else if (a[i][j] == 'O') {
tx = i;
ty = j;
a[i][j] = '.';
}
}
}
while (!q.empty()) {
auto [ x, y ] = q.front();
q.pop();
for (int k = 0; k < 4; k++) {
if (a[x + dx[k]][y + dy[k]] == '.' && dd[x + dx[k]][y + dy[k]] > dd[x][y] + 1) {
dd[x + dx[k]][y + dy[k]] = dd[x][y] + 1;
q.push({ x + dx[k], y + dy[k] });
}
}
}
if (!good(1)) {
return -1;
}
int l = 1, r = n + m;
while (l <= r) {
int mid = (l + r) >> 1;
if (good(mid)) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return r;
}
signed main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
read();
fout << solve() << endl;
return 0;
}