Cod sursa(job #2935581)

Utilizator matthriscuMatt . matthriscu Data 6 noiembrie 2022 23:34:07
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 1005
#define INF 0x3f3f3f3f

const int dx[] {-1, 1, 0, 0},
		  dy[] {0, 0, -1, 1};

int main() {
	ifstream fin("barbar.in");
	ofstream fout("barbar.out");

	int n, m;
	fin >> n >> m;

	int dist[NMAX][NMAX];
	memset(dist, 0x37, sizeof(dist));

	pair<int, int> src, dst;
	queue<pair<int, int>> q;
	char a[NMAX][NMAX];
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= m; ++j) {
			fin >> a[i][j];
			if (a[i][j] == 'D') {
				q.push({i, j});
				dist[i][j] = 0;
			} else if (a[i][j] == 'I')
				src = {i, j};
			else if (a[i][j] == 'O')
				dst = {i, j};
		}

	for (int i = 1; i <= n; ++i)
		a[i][0] = a[i][m + 1] = '*';
	for (int i = 1; i <= m; ++i)
		a[0][i] = a[n + 1][i] = '*';

	bool visited[NMAX][NMAX] {};
	int dist_max = INT_MIN;
	while (!q.empty()) {
		auto [x, y] = q.front();
		q.pop();

		if (visited[x][y])
			continue;

		visited[x][y] = true;

		for (int d = 0; d < 4; ++d) {
			const int new_x = x + dx[d], new_y = y + dy[d];
			if (a[new_x][new_y] != '*' && !visited[new_x][new_y]) {
				dist[new_x][new_y] = dist[x][y] + 1;
				dist_max = max(dist[new_x][new_y], dist_max);
				q.push({new_x, new_y});
			} 
		}
	}

	auto check = [&](int val) {
		memset(visited, 0, sizeof(visited));

		queue<pair<int, int>> q;
		q.push(src);

		while (!q.empty()) {
			if (q.front() == dst)
				return true;

			auto [x, y] = q.front();
			q.pop();

			if (visited[x][y])
				continue;

			visited[x][y] = true;

			for (int d = 0; d < 4; ++d) {
				const int new_x = x + dx[d], new_y = y + dy[d];
				if (a[new_x][new_y] != '*' && !visited[new_x][new_y] && dist[new_x][new_y] >= val)
					q.push({new_x, new_y});
			}
		}

		return false;
	};

	int val, step;
	for (step = 1; step <= dist_max; step <<= 1);
	for (val = 0; step; step >>= 1)
		if (val + step <= dist_max && check(val + step))
			val += step;

	fout << (val ? val : -1) << '\n';
}