Pagini recente » Cod sursa (job #339672) | Cod sursa (job #1422792) | Cod sursa (job #2893770) | Cod sursa (job #2957971) | Cod sursa (job #1735954)
#include <bits/stdc++.h>
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 = 0, 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;
}