Cod sursa(job #8824)

Utilizator t30Rosu Teodor t30 Data 25 ianuarie 2007 17:54:28
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include<stdio.h>
long r,c,h[1010][1010],ok[1010][1010],si,sj,fi,fj;
long d[1000100],p,q,s;
void READ()
{
	long i,j;
	char x;
	FILE *f;
	f=fopen("barbar.in","r");
	fscanf(f,"%ld %ld",&r,&c);
	q=0;
	for(i=1;i<=r;i++)
	{  for(j=1;j<=c;j++)
	  {  fscanf(f,"%c",&x);
          while(x=='\n') fscanf(f,"%c",&x);
		  if(x=='.') h[i][j]=1;
		  else if(x=='D'){  h[i][j]=-1; ok[i][j]=1; d[++q]=1001*i+j; }
		  else if(x=='I'){ h[i][j]=1; si=i; sj=j; }
		  else if(x=='O') { h[i][j]=1; fi=i; fj=j; }
		  else { h[i][j]=2; ok[i][j]=-1; }
	  }
	}
	fclose(f);
}

void BUILD()
{ long x,y,i,j;
  p=1;
  while(p<=q)
  {
	  x=d[p]/1001;
	  y=d[p]%1001;

		 if(x>1) if(h[x-1][y]%2!=0 && h[x-1][y]>0 ) { ok[x-1][y]=ok[x][y]+1; d[++q]=(x-1)*1001+y; h[x-1][y]*=-1;}
		 if(x<r) if(h[x+1][y]%2!=0 && h[x+1][y]>0) { ok[x+1][y]=ok[x][y]+1; d[++q]=(x+1)*1001+y; h[x+1][y]*=-1;}
		 if(y>1) if(h[x][y-1]%2!=0 && h[x][y-1]>0) { ok[x][y-1]=ok[x][y]+1; d[++q]=x*1001+y-1; h[x][y-1]*=-1;}
		 if(y<c) if(h[x][y+1]%2!=0 && h[x][y+1]>0) { ok[x][y+1]=ok[x][y]+1; d[++q]=x*1001+y+1; h[x][y+1]*=-1;}
		 p++;
  }
  for(i=1;i<=r;i++)
	 for(j=1;j<=c;j++)
		h[i][j]=0;
}

int ver(long k)
{   long x,y,p,q;
    q=1;p=1;
    d[1]=1001*si+sj;
    while(p<=q)
    {
      
      x=d[p]/1001;
      y=d[p]%1001;
      if(x==fi && y==fj) return 1;
      if(x>1 && ok[x-1][y]>=k && h[x-1][y]!=k) 
      {
             h[x-1][y]=k;
             d[++q]=d[p]-1001;
      }
      if(x<r && ok[x+1][y]>=k && h[x+1][y]!=k) 
      {
             h[x+1][y]=k;
             d[++q]=d[p]+1001;
      }
      if(y>1 && ok[x][y-1]>=k && h[x][y-1]!=k) 
      {
             h[x][y-1]=k;
             d[++q]=d[p]-1;
      }
      if(y<c && ok[x][y+1]>=k && h[x][y+1]!=k) 
      {
             h[x][y+1]=k;
             d[++q]=d[p]+1;
      }
     p++;
    }
return 0;    
}


void SOLVE()
{    long step;
     for(step=1;step<ok[si][sj];step<<=1);
     for(s=0;step;step>>=1)
        if(s+step<=ok[si][sj] && ver(s+step)) s+=step;
}

void PRINT()
{ long i,j;
  FILE *g;
  g=fopen("barbar.out","w");
  /*
  for(i=1;i<=r;i++)
  {
    for(j=1;j<=c;j++)
      fprintf(g,"%d ",ok[i][j]);
    fprintf(g,"\n");
}*/
  
  
  if(s>1) 
  fprintf(g,"%ld\n",s-1);
  else fprintf(g,"-1");
  fclose(g);
}


int main()
{
READ();
BUILD();
SOLVE();
PRINT();

return 0;
}