Pagini recente » Cod sursa (job #1561729) | Cod sursa (job #908809) | Cod sursa (job #731335) | Cod sursa (job #1625018) | Cod sursa (job #2971472)
#include <fstream>
#include <queue>
#include <cstring>
#define dim 1005
using namespace std;
ifstream in ("barbar.in");
ofstream out("barbar.out");
int n, m, d[dim][dim], xi, yi, xf, yf, sol;
short int a[dim][dim];
bool viz[dim][dim];
char ch;
int dx[] = {0, 1, 0, -1, 0},
dy[] = {0, 0, 1, 0, -1};
struct point {
int l;
int c;
};
queue <point> q;
bool inside(int i, int j)
{
return i >= 1 && i <= n && j >= 1 && j <= m;
}
bool lee(int k)
{
memset(viz, 0, sizeof(viz));
if (d[xi][yi] > k) {
q.push({xi, yi});
viz[xi][yi] = 1;
}
else
return false;
while (!q.empty()) {
int l = q.front().l,
c = q.front().c;
q.pop();
for (int dir = 1; dir <= 4; dir++) {
int lv = l + dx[dir],
cv = c + dy[dir];
if (inside(lv, cv) && !a[lv][cv] && viz[lv][cv] == false && d[lv][cv] > k) {
viz[lv][cv] = true;
q.push({lv, cv});
}
}
}
return viz[xf][yf];
}
int main()
{
in >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
in >> ch;
if (ch == 'D') {
a[i][j] = 2;
q.push({i, j});
d[i][j] = 1;
}
else if (ch == '*')
a[i][j] = 1;
else if (ch == 'I') {
xi = i,
yi = j;
}
else if (ch == 'O'){
xf = i,
yf = j;
}
}
while (!q.empty()) {
int l = q.front().l,
c = q.front().c;
q.pop();
for (int dir = 1; dir <= 4; dir++) {
int lv = l + dx[dir],
cv = c + dy[dir];
if (inside(lv, cv) && !a[lv][cv] && !d[lv][cv]) {
d[lv][cv] = d[l][c] + 1;
q.push({lv, cv});
}
}
}
int st = 0, dr = n * m;
sol = -1;
while (st <= dr) {
int mid = (st + dr) / 2;
bool ok = lee(mid);
if (ok) {
sol = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
out << sol;
return 0;
}