Cod sursa(job #779672)

Utilizator lucian666Vasilut Lucian lucian666 Data 18 august 2012 14:51:08
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb


//Vasilut

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


#define pereche pair<int,int>
#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,a[NN][NN],d[NN][NN],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 read();
void LEE1();
int LEE2(int );
void bsearch(int begin,int end);

int main()
{
	read();
	LEE1();
	ans=0;
	bsearch(1,d[x.f][x.s]);
	out<<ans-1;
	return 0;
}


void read()
{
	
	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]=0,d[i][j]=0;
				if  ( c == '*' )
					a[i][j]=-1,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== '0' )
					y.f=i,y.s=j;
			}
}


void LEE1()
{
	while(!Q.empty())
	{
		pereche k;
		k=Q.front();
		for(int i=0;i<4;i++)
		{
			int ii,jj;
			ii=k.f + di[i];
			jj=k.s + dj[i];
				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)
{
	if ( d[x.f][x.s] < val )
		return 0;
	Q.push(x);
		while(!Q.empty())
		{
			pereche k;
				for(int i=0;i<4;i++)
				{
					int ii,jj;
					ii=di[i] + k.f;
					jj=dj[i] + 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;
							}
						}
				}
			Q.pop();
		}
		return 0;
}

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