Cod sursa(job #362589)

Utilizator lovestospoogestan marsh lovestospooge Data 10 noiembrie 2009 10:03:26
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <stdio.h>
int n,m,i,j,x,y,x1,y1,maxim,dragoni;
int p,u,la,ca,lv,cv;

unsigned char c[100000][2];

char ch;

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

int max(int a, int b)
{
 if(a>b) return a;
   else return b;
}

int min(int a, int b)
{
 if(a<b) return a;
    else return b;
}


void bordare()
{
 int i;
   for (i=0;i<=n+1;++i)
	{
	 a[i][0]=-2;
	 a[i][m+1]=-2;
	 }

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



int lee()
{

  int i;

  p=1; u=1;
  c[1][0]=x;
  c[1][1]=y;
  a[x][y]=-1;
  while (p<=u)
	{
	 la=c[p][0];
	 ca=c[p][1];
	 for (i=0;i<4;++i)
		{
		 lv=la+dx[i];
		 cv=ca+dy[i];

		 if(a[lv][cv]==0){
				  ++u;
				  c[u][0]=lv;
				  c[u][1]=cv;
				  a[lv][cv]=-1;
				  if (lv==x1 && cv==y1){
							return 1;
							}
				  }

		}
	 ++p;
	 }
  return 0;
}



void init(int nr)
{
 int i,j;

 for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
	 if(a[i][j]>=nr || a[i][j]==-1) a[i][j]=0;

}


void mat()
{

  int i;

  p=1; u=dragoni;


  while (p<=u)
	{
	 la=c[p][0];
	 ca=c[p][1];
	 for (i=0;i<4;++i)
		{
		 lv=la+dx[i];
		 cv=ca+dy[i];

		 if(a[lv][cv]==0){
				  ++u;
				  c[u][0]=lv;
				  c[u][1]=cv;
				  a[lv][cv]=a[la][ca]+1;

				  }

		}
	 ++p;
	 }

}


int main()
{

 freopen("barbar.in","r",stdin);
 freopen("barbar.out","w",stdout);

 scanf("%d %d", &n, &m);
 scanf("%c");

 for(i=1;i<=n;++i)
    {
     for(j=1;j<=m;++j)
	{
	 scanf("%c", &ch);
	 if(ch=='*')
		    {
		      a[i][j]=-2;

		      }
	  else if(ch=='D'){
			  dragoni++;
			  c[dragoni][0]=i;
			  c[dragoni][1]=j;
			  a[i][j]=0;
			  }
	  else if(ch=='I'){
			   x=i;
			   y=j;

			   }
		  else if(ch=='O'){
				   x1=i;
				   y1=j;

				   }
	  }
      scanf("%c");
      }

 bordare();
 mat();

 for(i=1;i<=dragoni;i++)
    a[c[i][0]][c[i][1]]=-2;

/* for(i=1;i<=n;i++)
   {
    for(j=1;j<=m;j++)
       printf("%d ", a[i][j]);
    printf("\n");
    }
*/

 maxim= max( max(a[x1-1][y1],a[x1+1][y1]) , max(a[x1][y1-1],a[x1][y1+1]) );

 for(i=maxim;i>=1;--i)
    {
     init(i);
     if (lee()==1){
		   printf("%d", i);
		   return 0;
		   }
     }

 printf("-1");

 return 0;
}