Cod sursa(job #3359704)

Utilizator markymrkKemenes Mark markymrk Data 2 iulie 2026 18:16:29
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#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";
	}
}