Cod sursa(job #567056)

Utilizator pykhNeagoe Alexandru pykh Data 29 martie 2011 17:55:26
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;

const char in[]="barbar.in";
const char out[]="barbar.out";

const int Max_N = 1<<10;
const int INF = 0x3f3f3f3f;

#define mp make_pair
#define x first
#define y second

pair<int, int> O, I, Q[Max_N * Max_N * 2];
int d[Max_N][Max_N], N, M;
char s[Max_N];
bool in_d[Max_N][Max_N];

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

void get_d()
	{
		for(int j = 1 ; j <= Q[0].x ; ++j)
			for(int i = 0 ; i < 4 ; ++i)
			{
				int xx = dx[i] + Q[j].x;
				int yy = dy[i] + Q[j].y;
				if(xx > 0 && xx <= N && yy > 0 && yy <= M && d[xx][yy] != -1 && d[Q[j].x][Q[j].y] + 1 < d[xx][yy])
				{
					d[xx][yy] = d[Q[j].x][Q[j].y] + 1;
					Q[++Q[0].x] = mp(xx, yy);
				}
			}
}

bool ver(int val)
	{
		if(d[I.x][I.y] < val)return false;
		Q[Q[0].x = 1] = mp(I.x, I.y);
		memset(in_d, false, sizeof(in_d));
		
		for(int j = 1 ; j <= Q[0].x ; ++j)
			for(int i = 0 ; i < 4 ; ++i)
			{
				int xx = dx[i] + Q[j].x;
				int yy = dy[i] + Q[j].y;
				if(xx > 0 && xx <= N && yy > 0 && yy <= M && d[xx][yy] != -1 && d[xx][yy]  >= val && !in_d[xx][yy])
				{
					Q[++Q[0].x] = mp(xx, yy);
					in_d[xx][yy] = true;
				if(xx == O.x && yy == O.y)
					return true;
				}
			}
	return false;
}


int bin_S()
	{
		int mid, lo = 1, hi = N + M + 1, sol = -1;
		
		while(lo <= hi)
		{
			mid = lo + (hi - lo) / 2;
			if(ver(mid))
			{
				sol = mid, lo = mid + 1;
			}
			else hi = mid - 1;
		}
		return sol;
}


int main()
	{
		freopen(in,"r",stdin);
		freopen(out,"w",stdout);
		scanf("%d %d", &N, &M );
		
		memset(d, INF, sizeof(d));
		
		for(int i = 1 ; i <= N ; ++i)
		{
			scanf("%s", s + 1);
			for(int j = 1 ; j <= M ; ++j)
			{
				if(s[j] == 'D')
				{
					
					Q[++Q[0].x] = mp(i,j);
					d[i][j] = 0;
				}
				if(s[j] == 'O')
					O = mp(i,j);
				if(s[j] =='I' ) I = mp(i, j);
				if(s[j] == '*')d[i][j] = -1;
			}
		}
		get_d();
		printf("%d\n", bin_S());
		return 0;
}