Cod sursa(job #362479)

Utilizator lovestospoogestan marsh lovestospooge Data 9 noiembrie 2009 20:45:09
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <stdio.h>
int n,m,i,j,x,y,x1,y1,maxim; 
int p,u,la,ca,lv,cv;

int r,c; 
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][n+1]=-2;
	 }
	 
   for(i=0;i<=m;i++)
    {
     a[0][i]=-2;  
     a[n+1][i]=-2;
    }  
}



int lee()
{
  unsigned char c[31000][2];  
  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 ok=0;
 int k=1;
 
 while(!ok)
 {
  ok=1;
  for(i=1;i<=n;i++)
     for(j=1;j<=m;j++)
         {
          if(a[i][j]==0) ok=0;
          if(a[i][j]==k) {
                          if(!a[i][j]) a[i-1][j]=k+1;
                          if(!a[i][j]) a[i+1][j]=k+1;
                          if(!a[i][j]) a[i][j-1]=k+1;
                          if(!a[i][j]) a[i][j+1]=k+1;
                          }
          }
   k++;
  }
  
} 
     
int main()
{
     
 freopen("barbar.in","r",stdin);   
 freopen("barbar.out","w",stdout);
 
 scanf("%d %d", &n, &m);
 
 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'){
                          if(!a[i][j]) a[i-1][j]=1;
                          if(!a[i][j]) a[i+1][j]=1;
                          if(!a[i][j]) a[i][j-1]=1;
                          if(!a[i][j]) a[i][j+1]=1;
                            
                          a[i][j]=-2;
                          }
          if(ch=='I'){
                      x=i;
                      y=j;
                      }
           else if(ch=='0'){
                            x1=i;
                            y1=j;
                            }
          }           
 
 bordare();
 mat();
 
 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;
}