Cod sursa(job #134459)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 11 februarie 2008 19:25:25
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream.h>
#include <string.h>
#define MAX 1015

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 a[MAX][MAX],n,m,xi,xf,yf,yi,xx[MAX*MAX],yy[MAX*MAX],numar,ok=0;

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

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

void lee (int q,int w)
{
    int ii[MAX*MAX], jj[MAX*MAX],nr=1;
    ii[0]=q;
    jj[0]=w;
    a[q][w]=1;
    for (int i=0;i<nr;i++)
      for (int k=0;k<4;k++)
	 if (a[ii[i] +x[k]][jj[i] +y[k]]!=-1)
	 if (ok==1){
	   a[ii[i] +x[k]][jj[i] +y[k]]=min(a[ii[i] +x[k]][jj[i] +y[k]],a[ii[i]][jj[i]]+1);
	   ii[nr]=ii[i]+x[k];
	   jj[nr]=jj[i]+y[k];
	   nr++;
	 }
	 else
	   if (a[ii[i] +x[k]] [jj[i] +y[k]]==0)
	   {
	   a[ii[i] +x[k]][jj[i] +y[k]] = a[ii[i]][jj[i]]+1;
	   ii[nr]=ii[i]+x[k];
	   jj[nr]=jj[i]+y[k];
	   nr++;

	 }

}

void fct()
{
   int max=n;
   if (m>n)
      max=m;

   for (int r=0;r<=max;r++)
   {
      a[r][0]=-1;
      a[r][m+1]=-1;
      a[n+1][r]=-1;
      a[0][r]=-1;
   }






    lee(xx[0],yy[0]);
       ok=1;
   for (int i=1;i<numar;i++)
       lee(xx[i],yy[i]);

}

void caut()
{
 int xx[MAX*MAX*2],yy[MAX*MAX*2],nr=1;
 xx[0]=xi;
 yy[0]=yi;
 for (int i=0;i<nr;i++)
   for (int k=0;k<4;k++)
      if (a[xx[i] +x[k]][yy[i] +y[k]]!=-1)
      {
	 a[xx[i] +x[k]][yy[i] +y[k]]=min(a[xx[i]+x[k]] [yy[i]+y[k]],a[xx[i] ][yy[i]]);
	 xx[nr]=xx[i]+x[k];
	 yy[nr]=yy[i]+y[k];
	 nr++;
      }
}

int main ()
{
   citire();
   fct();
   caut();
   return 0;
}