Pagini recente » Cod sursa (job #361938) | Cod sursa (job #2297135) | Cod sursa (job #3228733) | Cod sursa (job #1305352) | Cod sursa (job #2895963)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, k;
char c;
int mat[1001][1001];
bool a[1001][1001];
int dx[] = { 0, 0, -1, 1 };
int dy[] = { -1, 1, 0, 0 };
int istart, jstart, ifinal, jfinal;
int st, dr;
int max = -1;
int obs;
queue < pair < int, int > > coada;
bool border(int i, int j)
{
return i >= 1 && i <= n && j >= 1 && j <= m;
}
void LeeD()
{
while (!coada.empty())
{
int x = coada.front().first;
int y = coada.front().second;
coada.pop();
for (int i = 0; i <= 3; i++)
{
int inou = x + dx[i];
int jnou = y + dy[i];
if (border(inou, jnou) && mat[inou][jnou] == 0)
{
mat[inou][jnou] = mat[x][y] + 1;
coada.push(make_pair(inou, jnou));
}
}
}
}
void fill(int is, int js)
{
coada.push(make_pair(is, js));
a[is][js] = 1;
while (!coada.empty())
{
int x = coada.front().first;
int y = coada.front().second;
coada.pop();
for (int i = 0; i <= 3; i++)
{
int inou = x + dx[i];
int jnou = y + dy[i];
if (border(inou, jnou) && a[inou][jnou] == 0 && mat[inou][jnou] >= obs)
{
a[inou][jnou] = 1;
coada.push(make_pair(inou, jnou));
}
}
}
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
fin >> c;
if (c == '*')
mat[i][j] = -1;
else if (c == 'D')
{
mat[i][j] = 1;
coada.push(make_pair(i, j));
}
else if (c == 'I')
{
istart = i;
jstart = j;
}
else if (c == 'O')
{
ifinal = i;
jfinal = j;
}
}
LeeD();
int rez = -1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
mat[i][j] = mat[i][j] - 1;
if (mat[i][j] > dr)
dr = mat[i][j];
}
while (st <= dr)
{
obs = (st + dr) / 2;
if(mat[istart][jstart] >= obs)
fill(istart, jstart);
if (a[ifinal][jfinal] == 1)
{
rez = obs;
st = obs + 1;
}
else
dr = obs - 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i][j] = 0;
}
fout << rez;
}