Cod sursa(job #362419)

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

int r,c; 
char ch;

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


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];  
  
  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++;
  }
  
 max=k;
} 
     
int main()
{
  int ok=0;  
    
 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;
                          }
          }           
 
 bordare();
 mat();
 
 for(i=max;i>=1;i--)
    {
     init(i);
     if (lee()==1){
                   printf("%d", i);
                   return 0;
                   }
     }
     
 printf("-1");
         
 return 0;
}