Pagini recente » Cod sursa (job #49966) | Cod sursa (job #1640382) | Cod sursa (job #1770938) | Cod sursa (job #1383538) | Cod sursa (job #3152255)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int n, m, x, x2, y, y2;
int leed[1001][1001], a[1001][1001], mat[1001][1001];
int di[] = { 0,0,1,-1 };
int dj[] = { 1,-1,0,0 };
queue<pair<int, int>> d;
bool inmat(int i, int j)
{
return i >= 1 && i <= n && j >= 1 && j <= m;
}
void LEED()
{
while (!d.empty())
{
int is = d.front().first, js = d.front().second;
d.pop();
for (int k = 0; k < 4; k++)
{
int inou = is + di[k], jnou = js + dj[k];
if (inmat(inou, jnou) && a[inou][jnou] != -1 && leed[inou][jnou] == 0)
d.push({ inou,jnou }), leed[inou][jnou] = leed[is][js] + 1;
}
}
}
void clear(int b[1001][1001])
{
for (int i = 0; i <= 1000; i++)
for (int j = 0; j <= 1000; j++)
b[i][j] = 0;
}
bool lee(int dist)
{
clear(mat);
queue<pair<int, int>> q;
q.push({ x,y });
while (!q.empty())
{
int is = q.front().first, js = q.front().second;
q.pop();
for (int k = 0; k < 4; k++)
{
int inou = is + di[k], jnou = js + dj[k];
if (inmat(inou, jnou) && a[inou][jnou] != -1 && leed[inou][jnou] >= dist && mat[inou][jnou] == 0)
q.push({ inou,jnou }), mat[inou][jnou] = mat[is][js] + 1;
}
}
return (mat[x2][y2]);
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
char c;
cin >> c;
if (c == 'D')
d.push({ i,j }), leed[i][j] = 1, a[i][j] = -1;
if (c == '*')
a[i][j] = -1;
if (c == 'I')
x = i, y = j;
if (c == 'O')
x2 = i, y2 = j;
}
LEED();
int st = 1, dr = 1e5, rez = -1;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (lee(mij))
rez = mij,st = mij + 1;
else dr = mij - 1;
}
cout << (rez == -1 ? -1 : rez - 1);
}