Cod sursa(job #186254)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 27 aprilie 2008 02:48:07
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <stdio.h>
#define SI 1000000 
#define Nmax 1011
bool b[Nmax][Nmax];
int a[Nmax][Nmax];
struct punct{int c1,c2;};
punct plec,sos;
short int va[Nmax*Nmax*2];
short int vb[Nmax*Nmax*2];
int nrv;
const int lin[]={0,1,0,-1};
const int col[]={1,0,-1,0};

int rez,R,C;
inline int minim(int x,int y)
{
	if(x<y)
		return x;
	return y;
}	
void read()
{
	char ch;
	freopen("barbar.in", "r",stdin);
	freopen("barbar.out", "w",stdout);
	scanf("%d%d", &R,&C);
	for(int i=1;i<=R;++i)
	{
		scanf("%c", &ch);
		for(int j=1;j<=C;++j)
		{
			scanf("%c", &ch);
			if(ch=='I')
			{
				a[i][j]=SI;
				plec.c1=i;
				plec.c2=j;
			}	
			if(ch=='O')
			{
				a[i][j]=SI;
				sos.c1=i;
				sos.c2=j;
			}	
			if(ch=='.')
				a[i][j]=SI;
			if(ch=='*')
				a[i][j]=-2;
			if(ch=='D')
			{
				a[i][j]=0;
				va[++nrv]=i;
				vb[nrv]=j;
			}
		}	
	}	
}
void lee(int x,int y)
{
	for(int t=0;t<4;t++)
		if((a[x+lin[t]][y+col[t]]>a[x][y]+1))
		{
			a[x+lin[t]][y+col[t]]=a[x][y]+1;
			va[++nrv]=x+lin[t];
			vb[nrv]=y+col[t];
		}
}	
void fill(int x,int y,int z)
{
	for(int t=0;t<4;t++)
		if(a[x+lin[t]][y+col[t]]>=z && a[x+lin[t]][y+col[t]]!=-2 && !b[x+lin[t]][y+col[t]] && x+lin[t]<=R && x+lin[t]>=1 && y+col[t]<=C && y+col[t]>=1)
		{
			b[x+lin[t]][y+col[t]]=true;
			va[++nrv]=x+lin[t];
			vb[nrv]=y+col[t];
		}
}
inline int verifica(int x)
{
	nrv=1;
	for(int i=1;i<=R;++i)
		for(int j=1;j<=C;++j)
			b[i][j]=0;
	va[1]=plec.c1; vb[1]=plec.c2;
	b[plec.c1][plec.c2]=1;
	for(int i=1;i<=nrv;i++)
		fill(va[i],vb[i],x);
	//printf("m=%d\n",x);
	/*for(int i=1;i<=R;++i)  
    {  
      for(int j=1;j<=C;++j)  
              printf("%d ",b[i][j]);  
      printf("\n");  
    }   
    printf("\n"); */ 
	if(b[sos.c1][sos.c2]==1)
		return 1;
	return 0;
}	
void make_lee()
{
	for(int i=1;i<=nrv;i++)
		lee(va[i],vb[i]);
	//printf("%d\n",nrv);
	int m,u=0,p=1000000;
	//printf("%d %d %d %d\n",plec.c1,plec.c2,sos.c1,sos.c2);  
    //for(int i=1;i<=R;++i)  
    //{  
    //  for(int j=1;j<=C;++j)  
    //          printf("%d ",a[i][j]);  
    //  printf("\n");  
    //}   
    //printf("\n");  
    /*for(int i=1;i<=R;++i) 
    { 
        for(int j=1;j<=C;++j) 
            printf("%d ",a[i][j]); 
        printf("\n"); 
    } */ 
	while(u<=p)
	{
		m=(u+p)/2;
		if(verifica(m) )
			if(!verifica(m+1))
			{
				printf("%d\n",m);
				return;
			}
			else
				u=m+1;
		else
			p=m-1;
	}	
	printf("-1");
}
int main()
{
	read();
	make_lee();
	return 0;
}