Cod sursa(job #779687)

Utilizator lucian666Vasilut Lucian lucian666 Data 18 august 2012 15:24:23
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb

//Vasilut

#include<fstream>
#include<utility>
#include<queue>

#define NN 1001
#define f first
#define s second
#define mp make_pair

using namespace std;
ofstream out("barbar.out");

const int di[]={-1,1,0,0};
const int dj[]={0,0,-1,1};

int n,m;
int a[NN][NN],d[NN][NN];
int ans;

pair<int ,int > x,y;
queue<pair<int , int > > Q;


bool inside(int i,int j)
{
	if(i>0 && i<=n && j>0 && j<=m )
		return true;
	return false;
}


void LEE1();
int LEE2(int );
void bsrch(int ,int );

int main()
{
	
	ifstream in("barbar.in");
	in>>n>>m;
	char c;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			{
				in>>c;
				if  ( c == '.' )
					
					a[i][j]=d[i][j]=0;
				if  ( c == '*' )
					a[i][j]=d[i][j]=-1;
				if  ( c == 'I' )
					x.f=i,x.s=j;
				if  ( c == 'D' )
					{
						a[i][j]=-3;
						d[i][j]=1;
						Q.push(mp(i,j));
					}
				if	( c== 'O' )
					y.f=i,y.s=j;
			}
	LEE1();
	ans=0;
	bsrch(1,d[x.f][x.s]);
	out<<ans-1;
	return 0;
}





void LEE1()
{
	int ii,jj;
	while(!Q.empty())
	{
	pair<int,int> K;
	K=Q.front();
		for(int k=0;k<4;++k)
		{
			
			ii= K.f + di[k];
			jj= K.s + dj[k];
				if( inside( ii ,jj ) && ( d[ii][jj] == 0 || d[ii][jj] > d[K.f][K.s] + 1  ) )
				{
					d[ii][jj]=d[K.f][K.s] +1;
					Q.push(mp(ii,jj));
				}
		}
		Q.pop();
	}
}

int LEE2(int val)
{
	int ii,jj;
	if ( d[x.f][x.s] < val )
		return 0;
	Q.push(x);
		while(!Q.empty())
		{
			pair<int,int> K;
			K=Q.front();
			Q.pop();
				for(int k=0;k<4;++k)
				{
					
					ii=di[k] + K.f;
					jj=dj[k] + K.s;
					if( inside( ii ,jj ) && d[ii][jj] >= val && a[ii][jj] !=val  && a[ii][jj] >=0 )
						{
							Q.push(mp(ii,jj));
							a[ii][jj]=val;
							if( ii == y.f && jj==y.s )
							{
								for(;Q.size();Q.pop())
									return 1;
							}
						}
				}
			
		}
		return 0;
}

void bsrch(int st,int dr)
{
	
		if(st==dr)
		{
			if( st > ans  && LEE2(st))
				ans=st;
			return ;
		}
		int mij= ( st + dr )>>1;
		if ( LEE2(mij) == 1)
		{
			if(mij>ans)
				ans=mij;
			bsrch(mij+1,dr);
		}
		else
			bsrch(st,mij);
}