Pagini recente » Cod sursa (job #872976) | Cod sursa (job #2547091) | Cod sursa (job #674038) | Cod sursa (job #2592394) | Cod sursa (job #935153)
Cod sursa(job #935153)
#include <fstream>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int MAXN = 1100;
int N, M, dist[MAXN][MAXN], xs, ys, xf, yf;
bool viz[MAXN][MAXN];
char v[MAXN][MAXN];
int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};
bool isOkay(int minDist) {
queue< pair<int, int> > coada;
memset(viz, 0, sizeof(viz));
coada.push(make_pair(xs, ys));
if (dist[xs][ys] < minDist) return 0;
while (!coada.empty()) {
pair<int, int> a = coada.front();
coada.pop();
if (a.first == xf && a.second == yf)
return 1;
for (int i = 0 ; i < 4; ++i) {
int nx = a.first + dx[i];
int ny = a.second + dy[i];
if (nx > 0 && nx <= N && ny > 0 && ny <= M && dist[nx][ny] >= minDist && !viz[nx][ny] && v[nx][ny] != '*') {
viz[nx][ny] = 1;
coada.push(make_pair(nx, ny));
}
}
}
return 0;
}
int cauta_binar() {
int last = -1, st = 0, dr = N + M;
while (st <= dr) {
int mid = (st + dr) / 2;
if (isOkay(mid)) {
last = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
return last;
}
int main() {
fin >> N >> M; fin.get();
for (int i = 1; i <= N; ++i)
fin.getline(v[i] + 1, MAXN);
queue< pair<int, int> > coada;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j) {
if (v[i][j] == 'D') {
coada.push(make_pair(i, j));
dist[i][j] = 1;
}
if (v[i][j] == 'I') {
xs = i;
ys = j;
}
if (v[i][j] == 'O') {
xf = i;
yf = j;
}
}
while (!coada.empty()) {
pair<int, int> a = coada.front();
coada.pop();
for (int i = 0 ; i < 4; ++i) {
int nx = a.first + dx[i];
int ny = a.second + dy[i];
if (nx > 0 && nx <= N && ny > 0 && ny <= M && !dist[nx][ny] && v[nx][ny] != '*') {
dist[nx][ny] = dist[a.first][a.second] + 1;
coada.push(make_pair(nx, ny));
}
}
}
fout << cauta_binar() - 1;
return 0;
}