Cod sursa(job #174957)

Utilizator raduchilomRadu Chilom raduchilom Data 9 aprilie 2008 13:37:55
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include<fstream>
using namespace std;
fstream f,g;
char s[2];
int b[1001][1001],a[1001][1001],dx[500001],dy[500001],dx2[500001],dy2[500001];
long ix,iy,ex,ey,k1,k2;
long maxxx,l,h,ok,mij,maxx,n,i,m,c,j;
//functie gasire drum
int fill(int k,int pozx,int pozy)
{
if((b[pozx][pozy]==0)&&(a[pozx][pozy]>=k))
	{
	b[pozx][pozy]=1;
	fill(k,pozx-1,pozy);
	fill(k,pozx+1,pozy);
	fill(k,pozx,pozy-1);
	fill(k,pozx,pozy+1);
	}
return 0;
}

//functie b=0
int zero()
{
int i,j;
for(i=0;i<=n+1;i++)
	for(j=0;j<=m+1;j++)
		b[i][j]=0;
return 0;
}
int main()
{
f.open("barbar.in",ios::in);
g.open("barbar.out",ios::out);

f>>n>>m;
f.get();
c=0;
for(i=1;i<=n;i++)
	{
	for(j=1;j<=m;j++)
		{
		f.get(s,2,'\n');
		if(s[0]=='*')
			a[i][j]=0;
		if(s[0]=='.')
			a[i][j]=10000;
		if(s[0]=='D')
			{
			a[i][j]=0;
			c++;
			dx[c]=i; //x dragon
			dy[c]=j; //y dragon
			}
		if(s[0]=='I')
			{
			a[i][j]=0;
			ix=i;   //x intrare
			iy=j;   //y intrare
			}
		if(s[0]=='O')
			{
			a[i][j]=0;
			ex=i;   //x iesire
			ey=j;   //y iesire
			}
		}
	f.get();
	}

for(i=0;i<=n+1;i++)
	{
	a[i][0]=0;
	a[i][m+1]=0;
	}
for(i=0;i<=m;i++)
	{
	a[0][i]=0;
	a[n+1][i]=0;
	}

k1=c;
c=0;
while(k1!=0)
	{
	c++;
	k2=0;
	for(i=1;i<=k1;i++)
		{
		//i-1
		if((a[dx[i]-1][dy[i]]>0)&&(c<a[dx[i]-1][dy[i]]))
		  {
		  a[dx[i]-1][dy[i]]=c;
		  k2++;
		  dx2[k2]=dx[i]-1;
		  dy2[k2]=dy[i];
		  }

		//i+1
		if((a[dx[i]+1][dy[i]]>0)&&(c<a[dx[i]+1][dy[i]]))
		  {
		  a[dx[i]+1][dy[i]]=c;
		  k2++;
		  dx2[k2]=dx[i]+1;
		  dy2[k2]=dy[i];
		  }

		//j-1
		if((a[dx[i]][dy[i]-1]>0)&&(c<a[dx[i]][dy[i]-1]))
		  {
		  a[dx[i]][dy[i]-1]=c;
		  k2++;
		  dx2[k2]=dx[i];
		  dy2[k2]=dy[i]-1;
		  }

		//j+1
		if((a[dx[i]][dy[i]+1]>0)&&(c<a[dx[i]][dy[i]+1]))
		  {
		  a[dx[i]][dy[i]+1]=c;
		  k2++;
		  dx2[k2]=dx[i];
		  dy2[k2]=dy[i]+1;
		  }
		}
	k1=k2;
	for(i=1;i<=k2;i++)
		{
		dx[i]=dx2[i];
		dy[i]=dy2[i];
		}
	}

maxx=0;
if(a[ix-1][iy]>maxx)
	maxx=a[ix-1][iy];
if(a[ix+1][iy]>maxx)
	maxx=a[ix+1][iy];
if(a[ix][iy-1]>maxx)
	maxx=a[ix][iy-1];
if(a[ix][iy+1]>maxx)
	maxx=a[ix][iy+1];

maxxx=0;
if(a[ex-1][ey]>maxxx)
	maxxx=a[ex-1][ey];
if(a[ex+1][ey]>maxxx)
	maxxx=a[ex+1][ey];
if(a[ex][ey-1]>maxxx)
	maxxx=a[ex][ey-1];
if(a[ex][ey+1]>maxxx)
	maxxx=a[ex][ey+1];

if(maxx>maxxx)
	maxx=maxxx;
l=1;
h=maxx;
ok=-1;
a[ix][iy]=maxx;
a[ex][ey]=maxx;

while(l<=h)
	{
	mij=(l+h)/2;
	zero();
	fill(mij,ix,iy);
	if(b[ex][ey]==1)
		{
		ok=mij;
		l=mij+1;
		}
	  else
		{
		h=mij-1;
		}
	}
g<<ok;

f.close();
g.close();
return 0;
}