Pagini recente » Cod sursa (job #1702371) | Cod sursa (job #941282) | Cod sursa (job #1441589) | Cod sursa (job #1227318) | Cod sursa (job #3002214)
#include <fstream>
#include <queue>
using namespace std;
const int N = 1000;
const int DL[] = {-1, 0, 1, 0};
const int DC[] = {0, -1, 0, 1};
const int INF = 1000000000;
struct poz
{
int l, c;
};
queue <poz> q;
char a[N+2][N+2];
int d[N+2][N+2];
bool viz[N+2][N+2];
poz x_i, x_f;
int nl, nc;
void distante_dragoni()
{
while (!q.empty())
{
poz x = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
poz y = (poz){x.l + DL[i], x.c + DC[i]};
if (d[y.l][y.c] == INF)
{
d[y.l][y.c] = 1 + d[x.l][x.c];
q.push(y);
}
}
}
}
bool exista_drum(int d_min)
{
for (int i = 1; i <= nl; i++)
{
for (int j = 1; j <= nc; j++)
{
viz[i][j] = false;
}
}
queue <poz> q;
if (d[x_i.l][x_i.c] < d_min)
{
return false;
}
q.push(x_i);
viz[x_i.l][x_i.c] = true;
while (!q.empty())
{
poz x = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
poz y = (poz){x.l + DL[i], x.c + DC[i]};
if (d[y.l][y.c] >= d_min && !viz[y.l][y.c])
{
q.push(y);
viz[y.l][y.c] = true;
}
if (y.l == x_f.l && y.c == x_f.c)
{
return true;
}
}
}
return false;
}
int caut_dist_max()
{
int st = 0, dr = N*N, rez = -1;
while (st <= dr)
{
int m = (st + dr) / 2;
if (exista_drum(m))
{
rez = m;
st = m + 1;
}
else
{
dr = m - 1;
}
}
return rez;
}
int main()
{
ifstream in("barbar.in");
ofstream out("barbar.out");
in >> nl >> nc;
for (int i = 1; i <= nl; i++)
{
in >> (1 + a[i]);
for (int j = 1; j <= nc; j++)
{
if (a[i][j] == '.')
{
d[i][j] = INF;
}
else if (a[i][j] == '*')
{
d[i][j] = -2;
}
else if (a[i][j] == 'I')
{
d[i][j] = INF;
x_i = (poz){i, j};
a[i][j] = '.';
}
else if (a[i][j] == 'O')
{
d[i][j] = INF;
x_f = (poz){i, j};
a[i][j] = '.';
}
else
{
d[i][j] = 0;
q.push((poz){i, j});
}
}
}
distante_dragoni();
out << caut_dist_max();
in.close();
out.close();
return 0;
}