Cod sursa(job #2016459)

Utilizator flibiaVisanu Cristian flibia Data 29 august 2017 14:24:57
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;

int di[5] = {-1, 1, 0, 0}, dj[5] = {0, 0, -1, 1};
int n, m, d[1010][1010], x, y, xx, yy, gg, wp, st, dr, mid;
bool viz[1010][1010], seen[1010][1010];
pair <int, int> w;
queue <pair <int, int> > q;
string s;

bool check(int v){
	if(d[x][y] < v) return 0;
	for(int i = 0; i <= n + 1; i++)
		for(int j = 0; j <= m + 1; j++) seen[i][j] = viz[i][j];
	while(!q.empty()) q.pop();
	q.push({x, y});
	seen[x][y] = 1;
	while(!q.empty()){
		w = q.front();
		if(w.first == xx && w.second == yy) return 1;
		q.pop();
		for(int k = 0; k < 4; k++){
			gg = w.first + di[k];
			wp = w.second + dj[k];
			if(!seen[gg][wp] && d[gg][wp] >= v){
				seen[gg][wp] = 1;
				q.push({gg, wp});
			}
		}
	}
	return 0;
}

int main(){
	ifstream in("barbar.in");
	ofstream out("barbar.out");
	in >> n >> m;
	for(int i = 1; i <= n; i++){
		in >> s;
		for(int j = 1; j <= m; j++){
			if(s[j-1] != '.') viz[i][j] = 1;
			if(s[j-1] == 'I') x = i, y = j, viz[i][j] = 0;
			if(s[j-1] == 'O') xx = i, yy = j, viz[i][j] = 0;
			if(s[j-1] == 'D') q.push({i, j});
		}
	}
	for(int i = 0; i <= n + 1; i++) viz[i][0] = viz[i][m+1] = 1;
	for(int i = 0; i <= m + 1; i++) viz[0][i] = viz[n+1][i] = 1;
	for(int i = 0; i <= n + 1; i++)
		for(int j = 0; j <= m + 1; j++) seen[i][j] = viz[i][j];
	while(!q.empty()){
		w = q.front();
		q.pop();
		for(int k = 0; k < 4; k++){
			gg = w.first + di[k];
			wp = w.second + dj[k];
			if(!seen[gg][wp]){
				seen[gg][wp] = 1;
				d[gg][wp] = d[w.first][w.second] + 1;
				q.push({gg, wp});
			}
		}
	}
	st = 1; dr = 1e6;
	while(st <= dr){
		mid = (st + dr) / 2;
		if(check(mid)) st = mid + 1;
		else dr = mid - 1;
	}
	if(check(1) == 0) out << "-1";
	else out << dr;
	return 0;
}