Cod sursa(job #847561)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 4 ianuarie 2013 10:50:48
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.95 kb
#include <fstream>

using namespace std;

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

	char x;
long int m[1002][1002];
bool trecut[1002][1002];
struct
{
	long int linie;
	long int coloana;
	long int pericol;
}v[350000]; //de calculat cat de mare trebuie


long long int r,c,i,j,k,cap,coada,lin_intru,col_intru,lin_ies,col_ies;
	
bool posibil(int nr)
{
	v[1].linie=lin_intru;
	v[1].coloana=col_intru;
	//v[1].pericol=m[lin_intru][lin_ies];
				
				cap=1;
				coada=2;
				
				
				while(cap<coada) //sa scot o conditie
				{
					
						
					trecut[v[cap].linie][v[cap].coloana]=1;
					/*for(i=0;i<=c+1;i++)
					{
						for(j=0;j<=r+1;j++)
							cout<<trecut[i][j];
						cout<<endl;
					}*/
					
					//cout<<"lin="<<v[cap].linie<<" col="<<v[cap].coloana<<endl;
					if(v[cap].linie==lin_ies && v[cap].coloana==col_ies)
					{//si cand merge se initializeaza
						for(k=0;k<=coada+1;k++)
				{
					v[k].linie=0;
					v[k].coloana=0;
					v[k].pericol=0;
				}
				
				for(i=0;i<=c;i++)
					for(j=0;j<=r;j++)  //nu se initializeaza bine
						trecut[i][j]=0;
				return 1;
					}
					for(k=0;k<4;k++)
					{
						if(m[v[cap].linie+dy[k]][v[cap].coloana+dx[k]]>=nr && trecut[v[cap].linie+dy[k]][v[cap].coloana+dx[k]]==0 && v[cap].linie+dy[k]<=r && v[cap].coloana+dx[k]<=c && v[cap].linie+dy[k]>0 && v[cap].coloana+dx[k]>0)
						{
							v[coada].linie=v[cap].linie+dy[k];
							v[coada].coloana=v[cap].coloana+dx[k];
							coada++;
						}
					}
					cap++;
				}
				
				for(k=0;k<=coada+1;k++)
				{
					v[k].linie=0;
					v[k].coloana=0;
					v[k].pericol=0;
				}
				
				for(i=0;i<=c;i++)
					for(j=0;j<=r;j++)  //nu se initializeaza bine
						trecut[i][j]=0;
				
				return 0;
}

int main()
{
	ifstream fin("barbar.in");
	ofstream fout("barbar.out");
	fin>>r>>c;
	
	for(i=1;i<=r;i++)
	{
		for(j=1;j<=c;j++)
		{
			fin>>x;
			if(x=='I')
			{
				m[i][j]=1002001;
				lin_intru=i;
				col_intru=j;
			}
			if(x=='O')
			{
				m[i][j]=1002001;
				lin_ies=i;
				col_ies=j;
			}
			if(x=='*')m[i][j]=-1;
			if(x=='D')m[i][j]=0;
			if(x=='.')m[i][j]=1002001;
		}
	}
	/*
	for(i=1;i<=r;i++)
	{
		for(j=1;j<=c;j++)
		{
			cout<<m[i][j]<<' ';
		}
		cout<<endl;
	}
	*/
	
	
	
	
	
	
	
	for(i=1;i<=r;i++)
		for(j=1;j<=c;j++)
			if(m[i][j]==0)
			{
				v[1].linie=i;
				v[1].coloana=j;
				v[1].pericol=0;
				
				cap=1;
				coada=2;
				
				
				while(cap<coada) //sa scot o conditie
				{
					for(k=0;k<4;k++)
					{
						if(m[v[cap].linie+dy[k]][v[cap].coloana+dx[k]]!=-1 && v[cap].pericol+1<m[v[cap].linie+dy[k]][v[cap].coloana+dx[k]] && v[cap].linie+dy[k]<=r && v[cap].coloana+dx[k]<=c && v[cap].linie+dy[k]>0 && v[cap].coloana+dx[k]>0)
						{
							m[v[cap].linie+dy[k]][v[cap].coloana+dx[k]]=v[cap].pericol+1;
							v[coada].linie=v[cap].linie+dy[k];
							v[coada].coloana=v[cap].coloana+dx[k];
							v[coada].pericol=v[cap].pericol+1;
							coada++;
						}
					}
					cap++;
				}
				
				for(k=1;k<=coada+1;k++)
				{
					v[k].linie=0;
					v[k].coloana=0;
					v[k].pericol=0;
				}
				
			}
	//cout<<endl<<endl;
	/*for(i=1;i<=r;i++)
	{
		for(j=1;j<=c;j++)
		{
			cout<<m[i][j]<<' ';
		}
		cout<<endl;
	}
	cout<<endl;*/
	long int cautat=-1;
	long int sus;
	if(m[lin_intru][col_intru]>m[lin_ies][col_ies])
		sus=m[lin_ies][col_ies];
	else
	    sus=m[lin_intru][col_intru];
	long int jos=-1;
	long int mijl=(sus+jos)/2;
	
		//cout<<"sus: "<<sus<<" jos: "<<jos<<" mijl: "<<mijl<<endl;
	while(jos<=sus)
	{
		//cout<<"sus: "<<sus<<" jos: "<<jos<<" mijl: "<<mijl<<endl;
	 	if(posibil(mijl))
		{
			cautat=mijl;
			jos=mijl+1;
		}
		else
		{
			sus=mijl-1;
		}
		mijl=(sus+jos)/2;
		//if(sus==jos)break;
	}
	
	fout<<mijl<<endl;
	//cout<<posibil(3);
	
	//sterg asta si scriu finalul caci functia merge si sa fiu atent la cazul de iesire fara initializare !
	fin.close();
	fout.close();
	return 0;
}