Cod sursa(job #2524545)

Utilizator AlexNeaguAlexandru AlexNeagu Data 15 ianuarie 2020 20:59:25
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 666013;
const int N = 1005;
ifstream in("barbar.in");
ofstream out("barbar.out");
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
vector < pair < int, int > > initial_dragons;
pair < int, int > startp;
pair < int, int > endp;
int precalc_matrix[N][N], n, m, mx = 0;
bool matrix[N][N];
bool ok1(int x, int y) {
	if (x < 1 || y < 1 || x > n || y > m) {
		return false;
	}
	if (precalc_matrix[x][y] != 0) {
		return false;
	}
	return true;
}
bool ok(int x, int y) {
	if (x < 1 || y < 1 || x > n || y > m) {
		return false;
	}
	if (precalc_matrix[x][y] == -1) {
		return false;
	}
	if (matrix[x][y] == 1) {
		return false;
	}
	return true;
}
void set_bfs(vector < pair < int, int > > &v) {
	queue < pair < int, int > > q;
	for (auto it : v) {
		q.push({it.first, it.second});
	}
	while(!q.empty()) {
		int x = q.front().first;
		int y = q.front().second;
		q.pop();
		for (int d = 0; d < 4; d++) {
			if (ok1(x + dx[d], y + dy[d])) {
				q.push({x + dx[d], y + dy[d]});
				  if (precalc_matrix[x][y] == -1) {
						precalc_matrix[x + dx[d]][y + dy[d]] = 1;
						mx = max(mx, precalc_matrix[x + dx[d]][y + dy[d]]);
				}
				else {
					precalc_matrix[x + dx[d]][y + dy[d]] = precalc_matrix[x][y] + 1;
					mx = max(mx, precalc_matrix[x + dx[d]][y + dy[d]]);
				}
			}
		}
	}
}
bool bfs(int target_value) {
	queue < pair < int, int > > q;
	memset(matrix, 0, sizeof(matrix));
	if (precalc_matrix[startp.first][startp.second] >= target_value) q.push({startp.first, startp.second});
	while(q.size()) {
		int x = q.front().first;
		int y = q.front().second;
		matrix[x][y] = 1;
		q.pop();
		for (int d = 0; d < 4; d++) {
			if (ok(x + dx[d], y + dy[d]) && precalc_matrix[x + dx[d]][y + dy[d]] >= target_value) {
				q.push({x + dx[d], y + dy[d]});
			}
		}
	}
	if (matrix[endp.first][endp.second] == 1) {
		return true;
	}
	return false;
}
int main() {
	in >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			char c;
			in >> c;
			if (c == 'I') {
				startp = {i, j};
			}
			if (c == 'O') {
				endp = {i, j};
			}
			if (c == 'D') {
				precalc_matrix[i][j] = -1;
				initial_dragons.push_back({i, j});
			}
		}
	}
	set_bfs(initial_dragons);
	int l = 1, r = mx, ans = -1;
	while(l <= r) {
		int mid = (l + r) / 2;
		if (bfs(mid)) {
			ans = mid;
			l = mid + 1;
		}
		else {
			r = mid - 1;
		}
	}
	out << ans << "\n";
	return 0;
}