Pagini recente » Cod sursa (job #779369) | Cod sursa (job #1686608) | Cod sursa (job #3242434) | Cod sursa (job #2937962) | Cod sursa (job #2498794)
#include <fstream>
using namespace std;
int n, m, ok, lin, col, dr;
int di[] = {0, 0, 1, -1};
int dj[] = {1, -1, 0, 0};
char mat[1001][1001];
bool f[1001][1001];
int c1[1000001], c2[1000001], dist[1001][1001];
void initializare_dist() {
int i, j;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
dist[i][j] = -1;
}
bool test (int lin, int col) {
if (lin > 0 && lin <= n && col > 0 && col <= m && mat[lin][col] != '*' && dist[lin][col] == -1)
return 1;
return 0;
}
void bfs() {
int i, cnt, st;
cnt = 1;
st = 0;
while (st < dr) {
for (i = 0; i < 4; i++) {
if (test(c1[st] + di[i], c2[st] + dj[i])) {
cnt++;
c1[dr] = c1[st] + di[i];
c2[dr++] = c2[st] + dj[i];
dist[c1[st] + di[i]][c2[st] + dj[i]] = 1 + dist[c1[st]][c2[st]];
}
}
st++;
}
}
void reset() {
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
f[i][j] = 0;
}
void dfs(int l, int c, int x) {
int i, l1, c1;
if (l == 6 && c == 8 && x == 3)
i = 3;
if (ok == 1)
return;
f[l][c] = 1;
for (i = 0; i < 4; i++) {
l1 = l + di[i];
c1 = c + dj[i];
if (mat[l1][c1] == 'O') {
ok = 1;
return;
}
if (f[l1][c1] == 0 && dist[l1][c1] >= x && mat[l1][c1] == '.')
dfs(l1, c1, x);
}
}
int caut_bin() {
int st, dr, mij, sol;
st = 1;
dr = n * m;
sol = -1;
while (st <= dr) {
mij = (st + dr) / 2;
ok = 0;
dfs(lin, col, mij);
if (ok == 1) {
sol = mij;
st = mij + 1;
}
else
dr = mij - 1;
reset();
}
return sol;
}
int main() {
ifstream cin ("barbar.in");
ofstream cout ("barbar.out");
int i, j;
cin >> n >> m;
initializare_dist();
for (i = 1; i <= n; i++) {
cin.get();
for (j = 1; j <= m; j++) {
mat[i][j] = cin.get();
if (mat[i][j] == 'D') {
dist[i][j] = 0;
c1[dr] = i;
c2[dr++] = j;
}
if (mat[i][j] == 'I') {
lin = i;
col = j;
}
}
}
bfs();
cout << caut_bin();
return 0;
}