Cod sursa(job #1595499)

Utilizator valentin50517Vozian Valentin valentin50517 Data 10 februarie 2016 12:40:09
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <algorithm>
#include <climits>

using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

struct point{
		int x,y;
} I,O,D[1000100],C[3000000];

const int dx[4] = {1,0,-1,0},
		  dy[4] = {0,1,0,-1};
		  
int A[1010][1010],N,M,d,l,r,rs,step;
bool B[1010][1010];
string S;

void Lee(){
	l = 1;
	while(r >= l){
		for(int i = 0;i<4;i++){
			int x = C[l].x + dx[i];
			int y = C[l].y + dy[i];
			if(A[x][y] > A[C[l].x][C[l].y]+1){
				A[x][y] = A[C[l].x][C[l].y]+1;
				C[++r].x = x;
				C[r].y = y;
			}
		}
		l++;
	}
}

bool check(int val){
	r = l = 1;
	C[r].x = I.x;
	C[r].y = I.y;
	B[I.x][I.y] = 1;
	
	while(r >= l){
		for(int i = 0;i<4;i++){
			int x = C[l].x + dx[i];
			int y = C[l].y + dy[i];
			if(A[x][y] >= val && !B[x][y]){
				if(O.x == x && O.y == y){
						for(int j = 1;j<=r;j++) B[C[j].x][C[j].y] = 0;
						return true;
				}
				C[++r].x = x;
				C[r].y = y;
				B[x][y] = 1;
			}
		}
		l++;
	}
	for(int j = 1;j<=r;j++) B[C[j].x][C[j].y] = 0;
	return false;
}

int main(){
	fin >> N >> M;
	getline(fin,S);
	for(int i = 1;i<=N;i++) A[i][0] = -1; 
	for(int i = 1;i<=M;i++) A[0][i] = -1;
	for(int i = 1;i<=N;i++) A[i][M+1] = -1;
	for(int i = 1;i<=M;i++) A[N+1][i] = -1;
	for(int i = 1;i<=N;i++){
		getline(fin,S);
		for(int j = 0;j<int(S.length());j++){
				A[i][j+1] = INT_MAX;
				if(S[j] == '*') A[i][j+1] = -1;
				else
				if(S[j] == 'D') C[++r].x = i,C[r].y = j+1, A[i][j+1] = 0;
				else 
				if(S[j] == 'I') I.x = i, I.y = j+1;
				else 
				if(S[j] == 'O') O.x = i, O.y = j+1; 
		}
	}
	Lee();
	step = 1024;
	for(rs = 0;step;step>>=1)
			if(rs+step <= 1000 && check(rs+step)) rs+=step;
	
	if(rs) fout << rs;
	else fout << -1;
	
		return 0;
}