Pagini recente » Cod sursa (job #1292432) | Cod sursa (job #1790920) | Cod sursa (job #2409972) | Cod sursa (job #858482) | Cod sursa (job #2920443)
#include <fstream>
#include <queue>
using namespace std;
ifstream in ("barbar.in");
ofstream out ("barbar.out");
const int max_size = 1e3 + 1, max_dir = 4;
int a[max_size][max_size], d[max_size][max_size], p[max_size][max_size], n, m, xs, ys, xj, yj, max1,
di[] = {-1, 0, 1, 0},
dj[] = {0, 1, 0, -1};
queue <pair <int, int>> coada;
void prec_d()
{
while (!coada.empty())
{
int i = coada.front().first, j = coada.front().second;
max1 = max(d[i][j], max1);
coada.pop();
for (int k = 0; k < max_dir; k++)
{
int iv = i + di[k], jv = j + dj[k];
if (iv > 0 && jv > 0 && iv <= n && jv <= m && a[iv][jv] == 0)
{
a[iv][jv] = 1;
d[iv][jv] = d[i][j] + 1;
coada.push({iv, jv});
}
}
}
}
bool probabfs (int x)
{
if (d[xs][ys] < x || d[xj][yj] < x)
{
return false;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (a[i][j] == -1)
{
p[i][j] = -1;
}
else
{
p[i][j] = 0;
}
}
}
coada.push({xs, ys});
while (!coada.empty())
{
int i = coada.front().first, j = coada.front().second;
coada.pop();
for (int k = 0; k < max_dir; k++)
{
int iv = i + di[k], jv = j + dj[k];
if (iv > 0 && iv <= n && jv > 0 && jv <= m && p[iv][jv] == 0 && d[iv][jv] >= x)
{
p[iv][jv] = 1;
coada.push({iv, jv});
}
}
}
if (p[xj][yj] == 1)
{
return true;
}
return false;
}
int main ()
{
in >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
char ch;
in >> ch;
if (ch == 'D')
{
a[i][j] = -1;
coada.push({i, j});
}
if (ch == 'I')
{
xs = i;
ys = j;
}
if (ch == '*')
{
a[i][j] = -1;
d[i][j] = -1;
}
if (ch == 'O')
{
xj = i;
yj = j;
}
}
}
prec_d();
int dr = n, e = 1, ans = -1;
while (e <= dr)
{
e *= 2;
}
for (int st = 0; e > 0; e >>= 1)
{
if (probabfs(st + e))
{
ans = st + e;
st += e;
}
}
out << ans;
in.close();
out.close();
return 0;
}