Cod sursa(job #593772)

Utilizator elfusFlorin Chirica elfus Data 4 iunie 2011 15:15:14
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<stdio.h>
#include<string.h>
#define LMAX 1<<10
#include<vector>
#include<queue>

using namespace std;


int x[LMAX][LMAX],dx[]={-1,0,1,0},dy[]={0,1,0,-1},min1[LMAX][LMAX];
int n,m,x0,y0,x1,y1;
struct pozdy
{
	int x,y;
};

queue<pozdy> Q;

bool ok (int val)
{
	int d,mi,i,j;
	pozdy aux,newaux;
	while(!Q.empty())
		Q.pop();
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			min1[i][j]=-1;
	aux.x=x0; aux.y=y0; min1[x0][y0]=x[x0][y0]; Q.push(aux);
	while(!Q.empty())
	{
		aux=Q.front();
		for(d=0;d<=3;d++)
		{
			newaux.x=aux.x+dx[d];
			newaux.y=aux.y+dy[d];
			if(x[newaux.x][newaux.y]!=-1 && newaux.x!=0 && newaux.y!=0 && newaux.x<=n && newaux.y<=m)
			{
				mi=x[newaux.x][newaux.y] < min1[aux.x][aux.y] ? x[newaux.x][newaux.y] : min1[aux.x][aux.y];
				if(min1[newaux.x][newaux.y]==-1 || mi>min1[newaux.x][newaux.y])
				{
					min1[newaux.x][newaux.y]=mi;
					if(min1[newaux.x][newaux.y]>=val)
					Q.push(newaux);
				}
			}
		}
		Q.pop();
	}
	return min1[x1][y1] !=-1 ? 1 : 0;
}

int main()
{
	int i,j,d,val;
	char ch;
	
	pozdy aux,newaux;
	
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	
	scanf("%d%d\n",&n,&m);

	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			scanf("%c",&ch);
			if(ch=='.')
				x[i][j]=-2;
			if(ch=='*')
				x[i][j]=-1;
			if(ch=='D')
			{
				aux.x=i; aux.y=j;
				x[i][j]=0,Q.push(aux);
			}
			if(ch=='I')
				x[i][j]=-2,x0=i,y0=j;
			if(ch=='O')
				x[i][j]=-2,x1=i,y1=j;
		}
		scanf("\n");
	}
	while(!Q.empty())
	{
		aux=Q.front();
		for(d=0;d<=3;d++)
		{
			newaux.x=aux.x+dx[d]; 
			newaux.y=aux.y+dy[d];
			if(x[newaux.x][newaux.y]!=-1 && newaux.x!=0 && newaux.y!=0 && newaux.x<=n && newaux.y<=m)
				if(x[newaux.x][newaux.y]==-2 || x[aux.x][aux.y]+1<x[newaux.x][newaux.y])
				{
					x[newaux.x][newaux.y]=x[aux.x][aux.y]+1;
					Q.push(newaux);
				}
		}
		Q.pop();
	}
	int st=0,dr=n*m,med,last=-1;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			if(x[i][j]==-2)
				x[i][j]=0;
	while(st<=dr)
	{
		med=(st+dr)>>1;
		if(ok(med))
			st=med+1,last=med;
		else
			dr=med-1;
	}
	printf("%d",last);
	return 0;
}