Pagini recente » Cod sursa (job #841479) | Cod sursa (job #1746755) | Cod sursa (job #1995210) | Cod sursa (job #2206845) | Cod sursa (job #3148843)
#include <bits/stdc++.h>
#define cin fin
#define cout fout
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int nmax = 1005;
int n, m, st, dr, mij, mat[nmax][nmax], istart, jstart, ifinal, jfinal, dist[nmax][nmax], ans;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
queue<pair<int, int>> dragoni;
bitset<nmax> viz[nmax];
inline bool inmat(int i, int j) {
return i >= 1 and i <= n and j >= 1 and j <= m;
}
inline bool verif(int mid) {
queue<pair<int, int>> Q;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
viz[i][j] = 0;
}
}
Q.push({istart, jstart});
viz[istart][jstart] = 1;
while (!Q.empty()) {
int i = Q.front().first;
int j = Q.front().second;
Q.pop();
for (int k = 0; k < 4; k++) {
int ii = i + dx[k];
int jj = j + dy[k];
if (inmat(ii, jj) && dist[ii][jj] != INT_MIN && dist[ii][jj] >= mid && !mat[ii][jj] && !viz[ii][jj]) {
viz[ii][jj] = 1;
Q.push({ii, jj});
}
}
}
if (viz[ifinal][jfinal])
return true;
return false;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dist[i][j] = INT_MIN;
}
}
cin.get();
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
for (int j = 0; j < (int) s.size(); j++) {
if (s[j] == 'D') {
dragoni.push({i, j + 1});
mat[i][j + 1] = 1;
dist[i][j + 1] = 0;
} else if (s[j] == '*') {
mat[i][j + 1] = 1;
} else if (s[j] == 'I') {
istart = i;
jstart = j + 1;
} else if (s[j] == 'O') {
ifinal = i;
jfinal = j + 1;
}
}
}
while (!dragoni.empty()) {
int i = dragoni.front().first;
int j = dragoni.front().second;
dragoni.pop();
for (int k = 0; k < 4; k++) {
int ii = i + dx[k];
int jj = j + dy[k];
if (inmat(ii, jj) && !mat[ii][jj] && dist[ii][jj] == INT_MIN) {
dist[ii][jj] = dist[i][j] + 1;
dragoni.push({ii, jj});
}
}
}
st = 1;
dr = n * m;
while (st <= dr) {
mij = st + (dr - st) / 2;
if (verif(mij)) {
ans = mij;
st = mij + 1;
} else
dr = mij - 1;
}
cout << ans;
return 0;
}