Cod sursa(job #2525038)

Utilizator AlexNeaguAlexandru AlexNeagu Data 16 ianuarie 2020 18:50:01
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
ifstream in("barbar.in");
ofstream out("barbar.out");
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
queue < pair < int, int > > Dragons;
bool isDragon[N][N];
int matrix[N][N], viz[N][N];
pair < int, int > stp, enp;
int n, m;
bool ok(int x, int y) {
	if (isDragon[x][y]) {
		return false;
	}
	if (x < 1 || y < 1 || x > n || y > m) {
		return false;
	}
	if (matrix[x][y] != 0) {
		return false;
	}
	return true;
}
bool ok1(int x, int y) {
	if (x < 1 || y < 1 || x > n || y > m) {
		return false;
	}
	return true;
}
void set_bfs() {
	while(Dragons.size()) {
		int x = Dragons.front().first;
		int y = Dragons.front().second;
		Dragons.pop();
		for (int d = 0; d < 4; d++) {
			int new_x = x + dx[d];
			int new_y = y + dy[d];
			if (ok(new_x, new_y)) {
				Dragons.push(make_pair(new_x, new_y));
				matrix[new_x][new_y] = matrix[x][y] + 1;
			}
		}
	}
}
void dfs(int x, int y, int target, int put) {
	if (matrix[x][y] < target) {
		return;
	}
	viz[x][y] = put;
	for (int d = 0; d < 4; d++) {
		if (matrix[x + dx[d]][y + dy[d]] >= target && viz[x + dx[d]][y + dy[d]] != put && ok1(x + dx[d], y + dy[d]))
		dfs(x + dx[d], y + dy[d], target, put);
	}
}
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') {
				stp = make_pair(i, j);
			}
			if (c == 'O') {
				enp = make_pair(i, j);
			}
			if (c == '*') {
				matrix[i][j] = -1;
			}
			if (c == 'D') {
				Dragons.push(make_pair(i, j));
				isDragon[i][j] = 1;
			}
		}
	}
	set_bfs();
	int l = 0, r = 2020, ans = -1, f = 0;
	while(l <= r) {
		int mid = (l + r) / 2;
		f++;
			dfs(stp.first, stp.second, mid, f);
			if (viz[enp.first][enp.second] == f) {
				ans = mid;
				l = mid + 1;
			}
		else {
			r = mid - 1;
		}
	}
	out << ans << "\n";
}