Pagini recente » Cod sursa (job #754118) | Cod sursa (job #1370928) | Cod sursa (job #692455) | Cod sursa (job #2927892) | Cod sursa (job #2032988)
#define DM 1001
#include <cstring>
#include <fstream>
#include <queue>
using namespace std;
ifstream fi ("barbar.in");
ofstream fo ("barbar.out");
char c[DM][DM];
int n, m, dist[DM][DM], a, b, di[4] = {-1, 0, 1, 0}, dj[4] = {0, 1, 0, -1}, viz[DM][DM], endi, endj;
queue <pair <int, int> > q;
pair <int, int> v;
int ok(int x, int y){
return(x > 0 && y > 0 && x <= n && y <= m);
}
int bfs(int x)
{
for (int i = 1; i <= n; ++i)
memset(viz[i], 0, DM);
q.push(v);
viz[v.first][v.second] = dist[v.first][v.second];
while (!q.empty())
{
a = q.front().first, b = q.front().second;
q.pop();
for (int i = 0; i < 4; ++i)
if (ok(a + di[i], b + dj[i]) && !viz[a+di[i]][b+dj[i]] && dist[a+di[i]][b+dj[i]] >= x && c[a+di[i]][b+dj[i]] != 'D' && c[a+di[i]][b+dj[i]] != '*')
{
viz[a+di[i]][b+dj[i]] = dist[a+di[i]][b+dj[i]];
q.push({a + di[i], b + dj[i]});
}
}
if (viz[endi][endj])
return 1;
return 0;
}
int binar()
{
int hi = dist[v.first][v.second], lo = 1, mid;
while (hi > lo)
{
mid = (lo + hi + 1)/2;
if (bfs(mid))
lo = mid;
else
hi = mid - 1;
}
return lo;
}
int main()
{
fi >> n >> m;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
fi >> c[i][j];
if (c[i][j] != '*')
dist[i][j] = (1<<30);
if (c[i][j] == 'D')
{
dist[i][j] = 0;
q.push({i, j});
}
else if (c[i][j] == 'I')
v = {i, j};
else if (c[i][j] == 'O')
endi = i, endj = j;
}
while (!q.empty())
{
a = q.front().first, b = q.front().second;
q.pop();
for (int i = 0; i < 4; ++i)
if (ok(a + di[i], b + dj[i]) && dist[a+di[i]][b+dj[i]] > dist[a][b] + 1 && c[a+di[i]][b+dj[i]] != '*')
{
dist[a+di[i]][b+dj[i]] = dist[a][b] + 1;
q.push({a + di[i], b + dj[i]});
}
}
fo << binar();
return 0;
}