Pagini recente » Cod sursa (job #3359764) | Cod sursa (job #3359735) | Cod sursa (job #3359762) | Cod sursa (job #3359756) | Cod sursa (job #3359704)
#include <iostream>
#include <queue>
#define int long long
using namespace std;
const int Nmax = 1005;
int visited[Nmax][Nmax];
int monsters[Nmax][Nmax];
char arr[Nmax][Nmax];
int di[] = { -1, 0, 1, 0 };
int dj[] = { 0, 1, 0, -1 };
void clear(int n, int m) {
for (int i = 0; i <= n + 1; ++i) {
for (int j = 0; j <= m + 1; ++j) {
visited[i][j] = 0;
}
}
}
void fill(int i, int j, int minim) {
visited[i][j] = 1;
for (int k = 0; k < 4; ++k) {
int ni = i + di[k], nj = j + dj[k];
if ((monsters[ni][nj] >= minim || monsters[ni][nj] == -1) && arr[ni][nj] != '*' && visited[ni][nj] == 0) {
fill(ni, nj, minim);
}
}
}
bool check(int mid, int n, int m, pair<int, int> start, pair<int, int> end) {
clear(n, m);
fill(start.first, start.second, mid);
if (visited[end.first][end.second] == 1) {
return true;
}
return false;
}
signed main() {
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m; cin >> n >> m;
queue<pair<int, int>> q;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
monsters[i][j] = -1;
}
}
for (int i = 0; i < n + 1; ++i) {
arr[i][0] = '*';
arr[i][m + 1] = '*';
}
for (int i = 0; i < m + 1; ++i) {
arr[0][i] = '*';
arr[m + 1][i] = '*';
}
pair<int, int> start, end;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> arr[i][j];
if (arr[i][j] == 'D') {
q.push({ i, j });
monsters[i][j] = 0;
}
if (arr[i][j] == 'I') {
start.first = i;
start.second = j;
}
if (arr[i][j] == 'O') {
end.first = i;
end.second = j;
}
}
}
while (!q.empty()) {
int i = q.front().first;
int j = q.front().second;
q.pop();
for (int k = 0; k < 4; ++k) {
int ni = i + di[k], nj = j + dj[k];
if (monsters[ni][nj] == -1 && arr[ni][nj] != '*') {
monsters[ni][nj] = monsters[i][j] + 1;
q.push({ ni,nj });
}
}
}
//for (int i = 1; i <= n; ++i) {
// for (int j = 1; j <= m; ++j) {
// cout << monsters[i][j] << " ";
// }
// cout << "\n";
//}
int l = 0; int r = monsters[start.first][start.second];
while (l <= r) {
int mid = (l + r) / 2;
if (check(mid, n, m, start, end)) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
if (r == 0) {
cout << -1 << "\n";
}
else {
cout << r << "\n";
}
}