Cod sursa(job #134386)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 11 februarie 2008 16:50:57
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.08 kb
#include <fstream.h>
#include <math.h>
#include <string.h>
#define MAX 115
ifstream fin ("barbar.in");  
ofstream fout ("barbar.out");



const int x[4]={-1,0,0,1};
const int y[4]={0,-1,1,0};

 int n,a[MAX][MAX],m,xi,yi,xf,yf,mat[MAX][MAX],xxx[MAX],yyy[MAX],numar;

 void citire()
{
    fin>>n>>m;
      char s[1010];
    fin.getline(s,1010);
    for (int i=1;i<=n;i++)  
    {
       fin.getline (s,1010);  
     for (int j=1;j<strlen(s)+1;j++)
     {  
         if (s[j-1]=='.')  
            a[i][j]=-1;  
	 else
           if (s[j-1]=='*')  
          a[i][j]=-2;  
          else  
             if (s[j-1]=='D')  
                a[i][j]=0;  
             else  
               if (s[j-1]=='I')  
	       {
	     a[i][j]=-3;
             xi=i;  
             yi=j;  
               }  
               else  
             if (s[j-1]=='O')  
             {  
		a[i][j]=-3;
                xf=i;  
                yf=j;  
	     }
     }
    }

 }

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


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


 void umplu()
 {

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

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

}


 void lee(int xi,int yi)
 {
     int xx[11000],yy[11000];
     memset (xx,0,sizeof(xx));
     memset (yy,0,sizeof(yy));
     xx[0]=xi ;
     yy[0]=yi ;
     int nr=1;
     mat[xx[0]][yy[0]]=0;
     for (int i=0;i<nr;i++)
	for (int k=0;k<4;k++)
	  if (a[xx[i] +x[k]][yy[i] +y[k]]!=-2 && mat[xx[i]+x[k]][yy[i] +y[k]]!=-1)
	  {
	       if (a[xx[i]+ x[k]][yy[i] +y[k]]!=0){
		mat[xx[i] +x[k]][yy[i] +y[k]]=min(mat[xx[i] +x[k]][yy[i] +y[k]],mat[xx[i]][yy[i]]+1);
		xx[nr]=xx[i]+x[k];
		yy[nr]=yy[i]+y[k];
		nr++;
	       }

	  }
 }

 void fac()
 {
    int xx[11000],yy[11000];
    int nr=1;
    xx[0]=xi;
    yy[0]=yi;  
    int nr1=0;  
    while (nr){  
       nr1=0;  
    for (int i=0;i<nr;i++)  
       for (int k=0;k<4;k++)  
     if ( a[xx[i] +x[k]][yy[i] +y[k]] !=-2)  
      {  
	if (nr<999){
         mat[xx[i] +x[k]][yy[i] +y[k]]=min(mat[xx[i] +x[k]][yy[i] +y[k]],mat[xx[i]][yy[i]]);  
         xx[nr]=xx[i]+x[k];  
         yy[nr]=yy[i]+y[k];  
         nr++;  
         }  
         else  
         {  
         mat[xx[i] +x[k]][yy[i] +y[k]]=min(mat[xx[i] +x[k]][yy[i] +y[k]],mat[xx[i]][yy[i]]);  
         xx[nr1]=xx[i]+x[k];  
         yy[nr1]=yy[i]+y[k];  
	 nr1++;
         }  
      }  
       nr=nr1;  
    }  
 }  
   
 int main ()  
 {  
   citire();  
    umplu();

       for (int ii=1;ii<=n;ii++)
	   for (int jj=1;jj<=m;jj++)
	       mat[ii][jj]=MAX*MAX;

       for (int i=1;i<=n;i++)
	  for (int j=1;j<=m;j++)
	     if (a[i][j]==0)
		lee(i,j);
    fac();
    if (mat[xf][yf]==MAX*MAX)
       fout<<-1<<"\n";
    else
       fout<<mat[xf][yf]<<"\n";
    fout.close();
    fin.close();  
   return 0;  
 }