Cod sursa(job #779688)

Utilizator lucian666Vasilut Lucian lucian666 Data 18 august 2012 15:36:24
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.93 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 r;

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




void LEE1();
int LEE2(int );
void srq(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();
	r=0;
	srq(1,d[x.f][x.s]);
	out<<r-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();
	}
}


*/

void LEE1 (){
	
	while(!Q.empty()){
            pair<int,int> t=Q.front();
            for(int k=0;k<4;++k){
                int i=t.f+di[k],j=t.s+dj[k];
                if(i>0&&j>0&&i<=n&&j<=m&&(d[i][j]==0||d[i][j]>d[t.f][t.s]+1)){
                    d[i][j]=d[t.f][t.s]+1;
                    Q.push(make_pair(i,j));
                    }
                }
            Q.pop();
            }
	
}

/*z

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( ii>0&&jj>0&&ii<=n&&jj<=m && 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;
}


*/


int LEE2 (int val){
	
	if ( d[x.f][x.s] < val)
		return 0;
	Q.push(x);
	while(!Q.empty()){
            pair<int,int> K=Q.front();
           for(int k=0;k<4;++k )
		   {
			   int ii,jj;
				ii=K.f+di[k];
				jj=K.s+dj[k];
				
                if( ii>0 && jj>0 && ii<=n &&jj<=m && d[ii][jj]>=val && a[ii][jj]!=val && a[ii][jj]>=0)
				{
                    Q.push(make_pair(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 srq (int st, int dr)
{
	if (st==dr)
	{
		if (st>r && LEE2(st))
			r=st;
		return;
	}
	int mid=(st+dr)>>1;
	if (LEE2 (mid)==1)
	{
		if (mid>r)r=mid;
		srq(mid+1, dr);
	}
	else
		srq(st, mid);
}