Pagini recente » Cod sursa (job #2217738) | Cod sursa (job #2615027) | Cod sursa (job #2104311) | Cod sursa (job #1847528) | Cod sursa (job #2784313)
#include <fstream>
#include <cstring>
#include <deque>
#include <bitset>
#define DIM 510
using namespace std;
int C, n, m, k, ist, jst, ifin, jfin;
int a[DIM][DIM], v[DIM][DIM];
char ch;
bitset<DIM> viz[DIM];
bool ok;
deque<pair<int, int> > c;
int di[] = {0, 0, 1, -1};
int dj[] = {1, -1, 0, 0};
bool intra(int i, int j) {
return i >= 1 && i <= n && j >= 1 && j <= m;
}
int main() {
ifstream fin("barbar.in");
ofstream fout("barbar.out");
fin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
fin >> ch;
if (ch == 'I') {
ist = i;
jst = j;
a[i][j] = 0;
}
if (ch == '*') {
a[i][j] = 1;
}
if (ch == 'O') {
a[i][j] = 0;
ifin = i;
jfin = j;
}
if (ch == 'D') {
a[i][j] = 1;
v[i][j] = 0;
c.emplace_back(i, j);
}
}
}
while (!c.empty()) {
int ic = c.begin()->first;
int jc = c.begin()->second;
for (int d = 0; d < 4; d++) {
int iv = ic + di[d];
int jv = jc + dj[d];
if (intra(iv, jv) && a[iv][jv] == 0 && v[iv][jv] == 0) {
v[iv][jv] = v[ic][jc] + 1;
c.emplace_back(iv, jv);
}
}
c.pop_front();
}
int st = 1;
int dr = n * m;
while (st <= dr) {
int mid = (st + dr) / 2;
ok = false;
if (v[ist][jst] >= mid) {
c.emplace_front(ist, jst);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
viz[i][j] = false;
}
}
while (!c.empty()) {
int ic = c.begin()->first;
int jc = c.begin()->second;
for (int d = 0; d < 4; d++) {
int iv = ic + di[d];
int jv = jc + dj[d];
if (intra(iv, jv) && !a[iv][jv] && v[iv][jv] >= mid && !viz[iv][jv]) {
viz[iv][jv] = true;
c.emplace_back(iv, jv);
if (iv == ifin && jv == jfin) {
ok = true;
}
}
}
c.pop_front();
}
if (ok) {
st = mid + 1;
} else {
dr = mid - 1;
}
}
if (ok) {
fout << dr;
} else {
fout << -1;
}
return 0;
}