Pagini recente » Cod sursa (job #2140601) | Cod sursa (job #2374681) | Cod sursa (job #2142929) | Cod sursa (job #220257) | Cod sursa (job #2033402)
#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 di[] = {-1, 0, 1, 0}, dj[] = {0, 1, 0, -1};
int n, m, a, b, si, sj, ei, ej, dist[DM][DM], viz[DM][DM];
queue <pair <int, int> > q;
bool ok(int x, int y){
return (x > 0 && y > 0 && y <= m && x <= n);
}
bool bfs(int t[DM][DM], int x)
{
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]] >= x && c[a+di[i]][b+dj[i]] != '*' && !t[a+di[i]][b+dj[i]])
{
t[a+di[i]][b+dj[i]] = t[a][b] + 1;
q.push({a + di[i], b + dj[i]});
}
}
if (!t[ei][ej])
return 0;
return 1;
}
int binar()
{
int lo = 1, hi = dist[si][sj], mid;
while (hi > lo)
{
mid = (lo + hi + 1)/2;
for (int i = 1; i <= n; ++i)
memset(viz[i], 0, DM);
q.push({si, sj});
viz[si][sj] = 1;
if (mid <= dist[si][sj] && bfs(viz, 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] == 'D')
{
q.push({i, j});
dist[i][j] = 1;
}
if (c[i][j] == 'I')
si = i, sj = j;
if (c[i][j] == 'O')
ei = i, ej = j;
}
bfs(dist, 0);
q.push({si, sj});
viz[si][sj] = 1;
if (!bfs(viz, 1))
{
fo << -1;
return 0;
}
fo << binar() - 1;
return 0;
}