Pagini recente » Cod sursa (job #3154270) | Cod sursa (job #3159663) | Cod sursa (job #1461148) | Cod sursa (job #3250257) | Cod sursa (job #3262582)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, traseu[1005][1005], traseu2[1005][1005], istart, jstart, ifinal, jfinal, distmax;
char a[1005][1005];
queue < pair<int, int> > q;
const int di[] = {-1, 0, 1, 0}, dj[] = {0, 1, 0, -1};
void citire()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
fin >> a[i][j];
if (a[i][j] == 'I')
{
istart = i;
jstart = j;
}
else if (a[i][j] == 'O')
{
ifinal = i;
jfinal = j;
}
else if (a[i][j] == 'D')
{
q.push(make_pair(i, j));
}
}
}
}
void detTraseu()
{
while (!q.empty())
{
int i = q.front().first, j = q.front().second;
for (int k = 0; k < 4; k++)
{
int iv = i + di[k], jv = j + dj[k];
if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && a[iv][jv] != '*' && traseu2[iv][jv] == 0)
{
traseu2[iv][jv] = traseu2[i][j] + 1;
q.push(make_pair(iv, jv));
distmax = max(distmax, traseu2[iv][jv]);
}
}
q.pop();
}
}
void initializare()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
traseu[i][j] = 0;
}
int lee(int dif)
{
while (!q.empty()) q.pop();
initializare();
q.push(make_pair(istart, jstart));
while (!q.empty())
{
int i = q.front().first, j = q.front().second;
for (int k = 0; k < 4; k++)
{
int iv = i + di[k], jv = j + dj[k];
if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && traseu[iv][jv] == 0 &&
(a[iv][jv] == '.' || a[iv][jv] == 'O') && traseu2[iv][jv] >= dif)
{
traseu[iv][jv] = traseu[i][j] + 1;
q.push(make_pair(iv, jv));
if (iv == ifinal && jv == jfinal)
return 1;
}
}
q.pop();
}
return 0;
}
void detDistMax()
{
int st = 1, dr = distmax, rezultat = 0;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (lee(mij) == 1)
{
rezultat = mij;
st = mij + 1;
}
else
{
dr = mij - 1;
}
}
fout << rezultat;
}
int main()
{
citire();
detTraseu();
detDistMax();
return 0;
}