Pagini recente » Cod sursa (job #1222699) | Cod sursa (job #1287538) | Cod sursa (job #1442936) | Cod sursa (job #3177051) | Cod sursa (job #2527249)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int maxim;
int sol = -1;
const int nmax = 1005;
int n, m;
char mat[nmax][nmax];
int d[nmax][nmax];
int a[nmax][nmax];
pair <int, int> start, stop;
queue <pair <int, int> > q;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
inline void read()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
fin >> mat[i][j];
if (mat[i][j] == 'I')
start = {i, j};
if (mat[i][j] == 'O')
stop = {i, j};
if (mat[i][j] == 'D')
q.push({i, j});
}
}
}
inline bool ok(int i, int j)
{
return (i > 0 && j > 0 && i <= n && j <= m && mat[i][j] != 'D' && mat[i][j] != '*');
}
inline bool OK(int i, int j)
{
return (a[i][j] == 0 && i > 0 && j > 0 && i <= n && j <= m && mat[i][j] != 'D' && mat[i][j] != '*' && mat[i][j] != 'I');
}
inline void bfsinit()
{
while (!q.empty())
{
int i = q.front().first;
int j = q.front().second;
maxim = max(maxim, d[i][j]);
q.pop();
for (int directie = 0; directie < 4; directie++)
{
int i1 = i + dx[directie];
int j1 = j + dy[directie];
if (d[i1][j1] == 0 && ok(i1, j1))
d[i1][j1] = d[i][j] + 1, q.push({i1, j1});
}
}
}
inline void reset()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i][j] = 0;
}
inline bool bfs(int x)
{
while (!q.empty())
q.pop();
q.push({start.first, start.second});
reset();
while (!q.empty())
{
int i = q.front().first;
int j = q.front().second;
if (i == stop.first && j == stop.second)
return true;
q.pop();
for (int directie = 0; directie < 4; directie++)
{
int i1 = i + dx[directie];
int j1 = j + dy[directie];
if (OK(i1, j1) && d[i1][j1] >= x)
{
q.push({i1, j1});
a[i1][j1] = 1;
}
}
}
return false;
}
int main()
{
read();
bfsinit();
int st = 0;
int dr = maxim + 2;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (bfs(mij))
st = mij + 1, sol = mij;
else
dr = mij - 1;
}
bfs(sol);
fout << sol;
return 0;
}