Pagini recente » Cod sursa (job #2516966) | Cod sursa (job #1206382) | Cod sursa (job #2263546) | Cod sursa (job #2317460) | Cod sursa (job #2810863)
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
struct pereche
{
int x, y;
};
int r, c, i, j, x, y, st, dr, m, sol = -1;
int d[1010][1010];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
char temnita[1010][1010];
bool blocat[1010][1010];
bool viz[1010][1010];
queue<pereche> q;
pereche start, finish, p1;
bool ok (int i, int j)
{
return (i >= 1 && i <= r && j >= 1 && j <= c && temnita[i][j] != '*' && d[i][j] == -1);
}
bool ok2 (int i, int j, int nr)
{
return (i >= 1 && i <= r && j >= 1 && j <= c && temnita[i][j] != '*' && !viz[i][j] && d[i][j] >= nr);
}
bool traseu (int nr)
{
if (d[start.x][start.y] < nr)
return false;
q.push(start);
viz[start.x][start.y] = true;
while (!q.empty()) {
p1 = q.front();
if (p1.x == finish.x && p1.y == finish.y)
break;
for (i = 0; i < 4; i++) {
x = p1.x + dx[i];
y = p1.y + dy[i];
if (ok2(x, y, nr)) {
viz[x][y] = true;
q.push({x, y});
}
}
q.pop();
}
while (!q.empty())
q.pop();
for (i = 1; i <= r; i++)
for (j = 1; j <= c; j++)
viz[i][j] = false;
if (p1.x == finish.x && p1.y == finish.y)
return true;
return false;
}
int main()
{
f >> r >> c;
for (i = 1; i <= r; i++) {
f >> (temnita[i] + 1);
for (j = 1; j <= c; j++) {
d[i][j] = -1;
if (temnita[i][j] == 'D') {
d[i][j] = 0;
q.push({i, j});
}
else if (temnita[i][j] == 'I')
start = {i, j};
else if (temnita[i][j] == 'O')
finish = {i, j};
}
}
while (!q.empty()) {
p1 = q.front();
for (i = 0; i < 4; i++) {
x = p1.x + dx[i];
y = p1.y + dy[i];
if (ok(x, y)) {
d[x][y] = d[p1.x][p1.y] + 1;
q.push({x, y});
}
}
q.pop();
}
st = 1;
dr = r * c;
while (st <= dr) {
m = (st + dr) / 2;
if (traseu(m)) {
sol = m;
st = m + 1;
}
else
dr = m - 1;
}
g << sol;
f.close();
g.close();
return 0;
}