Pagini recente » Cod sursa (job #677106) | Cod sursa (job #2886137) | Cod sursa (job #217896) | Cod sursa (job #805698) | Cod sursa (job #2961326)
#include <fstream>
#include <queue>
#include <utility>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int DIM = 1010;
int n, m;
int xs, xf, ys, yf;
int a[DIM][DIM];
bool vis[DIM][DIM];
queue<pair<int, int>> q;
int di[] = { -1, 0, 1, 0 }, dj[] = { 0, 1, 0, -1 };
inline bool interior(int i, int j) {
return i >= 1 && i <= n && j >= 1 && j <= m;
}
int binarySearch() {
int result = -1;
int left = 1, right = n * m;
while (left <= right) {
int middle = (left + right) / 2;
if (a[xs][ys] < middle) {
right = middle - 1;
} else {
memset(vis, false, sizeof(vis));
q.push(make_pair(xs, ys));
vis[xs][ys] = true;
while (!q.empty()) {
int ci = q.front().first;
int cj = q.front().second;
q.pop();
for (int d = 0; d < 4; d++) {
int ni = ci + di[d];
int nj = cj + dj[d];
if (interior(ni, nj) && a[ni][nj] >= middle && !vis[ni][nj]) {
q.push(make_pair(ni, nj));
vis[ni][nj] = true;
}
}
}
if (vis[xf][yf]) {
result = middle;
left = middle + 1;
} else {
right = middle - 1;
}
}
}
return result;
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
char ch;
fin >> ch;
if (ch == '*') {
a[i][j] = -2;
}else if (ch == '.') {
a[i][j] = -1;
} else if (ch == 'D') {
q.push(make_pair(i, j));
a[i][j] = 0;
} else if (ch == 'I') {
xs = i, ys = j;
a[i][j] = -1;
} else if (ch == 'O') {
xf = i, yf = j;
a[i][j] = -1;
}
}
}
while (!q.empty()) {
int ci = q.front().first;
int cj = q.front().second;
q.pop();
for (int d = 0; d < 4; d++) {
int ni = ci + di[d];
int nj = cj + dj[d];
if (interior(ni, nj) && a[ni][nj] == -1) {
q.push(make_pair(ni, nj));
a[ni][nj] = a[ci][cj] + 1;
}
}
}
fout << binarySearch();
return 0;
}