Pagini recente » Cod sursa (job #2308312) | Cod sursa (job #1099713) | Cod sursa (job #2727439) | Cod sursa (job #2124179) | Cod sursa (job #2954959)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int R, C, xo, yo, xi, yi;
int d[1004][1004];
queue<pair<int, int>> q;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
vector<vector<int>> v;
void citire()
{
char c;
v.resize(1004);
for (int i = 0; i < 1003; i++)
{
v[i].resize(1004);
}
fin >> R >> C;
for (int i = 0; i < R; i++)
for (int j = 0; j < C; j++)
{
fin >> c;
if (c == 'I')
{
xi = i;
yi = j;
}
if (c == 'O')
{
xo = i;
yo = j;
}
if (c == 'D')
{
q.push({i, j});
d[i][j] = 1;
}
if (c == '*')
{
d[i][j] = -1;
}
}
}
bool inmat(int i, int j)
{
if (!(i >= 0 && j >= 0))
return false;
if (!(i < R && j < C))
return false;
return true;
}
void initializare()
{
while (!q.empty())
q.pop();
v.clear();
v.resize(1004);
for (int i = 0; i < 1003; i++)
v[i].resize(1004);
}
void leeD()
{
int x, y, vx, vy;
while (q.empty() == false)
{
x = q.front().first;
y = q.front().second;
for (int k = 0; k < 4; k++)
{
vx = x + dx[k];
vy = y + dy[k];
if (inmat(vx, vy) && d[vx][vy] == 0)
{
d[vx][vy] = d[x][y] + 1;
q.push({vx, vy});
}
}
q.pop();
}
}
bool lee(int k)
{
int x, y, vx, vy;
q.push({xi, yi});
v[xi][yi] = 1;
while (q.empty() == false)
{
x = q.front().first;
y = q.front().second;
for (int dir = 0; dir < 4; dir++)
{
vx = x + dx[dir];
vy = y + dy[dir];
if (inmat(vx, vy) && d[vx][vy] > k && v[vx][vy] == 0)
{
q.push({vx, vy});
v[vx][vy] = 1;
}
}
q.pop();
if (v[xo][yo] == 1)
{
return true;
}
}
return false;
}
int cb()
{
int st = 1, dr, mid, sol = -1;
dr = min(d[xi][yi], d[xo][yo]) - 1;
while (st <= dr)
{
mid = (st + dr) / 2;
initializare();
if (lee(mid))
{
sol = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
return sol;
}
int main()
{
citire();
leeD();
fout << cb();
return 0;
}