Pagini recente » Cod sursa (job #1859970) | Cod sursa (job #1314542) | Cod sursa (job #1484137) | Cod sursa (job #262238) | Cod sursa (job #2026828)
#include <cstdio>
#include <vector>
FILE *fin = fopen("barbar.in", "r");
FILE *fout = fopen("barbar.out", "w");
#define maxn 1000
std::vector<std::pair<int,int>> dragoni;
int l, c, p = 0, u = 0, n, m;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
struct poz {
short int lin;
short int col;
};
poz q[maxn * maxn + 1];
short int a[maxn + 3][maxn + 3];
bool viz[maxn + 3][maxn + 3];
void fill (int i, int j) {
viz[i][j] = 1;
for (int k = 0; k <= 3; k++) {
if (viz[i + dx[k]][j + dy[k]] == 0)
fill(i + dx[k], j + dy[k]);
}
}
inline void lee(int x, int y) {
p = 0;
u = 0;
q[0].lin = x;
q[0].col = y;
a[x][y] = 0;
viz[x][y] = 1;
while (p <= u) {
l = q[p].lin;
c = q[p].col;
p++;
for (int i = 0; i <= 3; i++) {
if (viz[l + dx[i]][c + dy[i]] == 0 && a[l + dx[i]][c + dy[i]] != -1) {
if (a[l][c] + 1 < a[l + dx[i]][c + dy[i]] || a[l + dx[i]][c + dy[i]] == 0) {
u++;
q[u].lin = l + dx[i];
q[u].col = c + dy[i];
a[l + dx[i]][c + dy[i]] = a[l][c] + 1;
viz[l + dx[i]][c + dy[i]] = 1;
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
viz[i][j] = 0;
}
}
int main() {
int x1, y1, x2, y2, rez;
fscanf(fin, "%d%d", &n, &m);
char ch = fgetc(fin);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
char ch = fgetc(fin);
if (ch == 'I') {
x1 = i;
y1 = j;
}
else if (ch == 'O') {
x2 = i;
y2 = j;
}
else if (ch == '*')
a[i][j] = -1;
else if (ch == 'D') {
dragoni.push_back (std::make_pair(i, j));
a[i][j] = -2;
}
}
char ch = fgetc(fin);
}
for (int i = 0; i <= n + 1; i++) {
a[i][0]= -1;
a[i][m+1]= -1;
}
for (int i = 0; i <= m + 1; i++) {
a[0][i]= -1;
a[n+1][i]= -1;
}
for (auto it : dragoni) {
int x = it.first;
int y = it.second;
lee(x, y);
}
int st = 0;
int dr = n;
if (m > dr) dr = m;
bool t = 0;
while (st + 1 < dr) {
int x = (st + dr) / 2;
for (int i = 0; i <= n + 1; i++) {
for (int j = 0; j <= m + 1; j++) {
if (a[i][j] < x && (i != x2 || j != y2))
viz[i][j] = 1;
}
}
fill(x1, y1);
if (viz[x2][y2] == 1) {
st = x;
t = 1;
}
else {
x--;
dr = x;
}
rez = x;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
viz[i][j] = 0;
}
}
if (st + 1 == dr)
rez = dr;
if (t == 0)
fprintf(fout, "-1");
else
fprintf(fout, "%d", rez);
return 0;
}