Cod sursa(job #138023)

Utilizator marinMari n marin Data 17 februarie 2008 19:48:32
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <stdio.h>
#define DIM 11

int a[DIM][DIM],x;
int d[DIM][DIM];
int n,m,i,j,t,dst,x1,y1,x2,y2,pr,ul,mij;
char v[DIM][DIM];
int c[2][DIM*DIM];
int di[4]={0,1,0,-1};
int dj[4]={1,0,-1,0};



int parc(int dist) {
  int i,j,p,u,k,ic,jc,iv,jv;
  for (i=1;i<=n;i++)
    for (j=1;j<=m;j++)
      v[i][j]=0;
  p=1;
  u=1;
  c[0][p]=x1;
  c[1][p]=y1;
  v[x1][y1]=1;
  while (p<=u) {
    ic=c[0][p];
    jc=c[1][p];
    for (k=0;k<=3;k++) {
      iv = ic+di[k];
      jv = jc+dj[k];
      if ((iv>=1)&&(iv<=n)&&(jv>=1)&&(jv<=m)&&(d[iv][jv]>dist)&&(v[iv][jv]==0)) {
	u++;
	if ((iv==x2)&&(jv==y2))
	  return 1;
	c[0][u]=iv;
	c[1][u]=jv;
	v[iv][jv]=1;
      }
    }
    p++;
  }
  return 0;

}




int main(){
  FILE *f = fopen("barbar.in","r");
  fscanf(f,"%d %d",&n, &m);
  i=1;j=1;
  for (t=1;t<=n*m;){
    fscanf(f,"%c",&x);
    if ((x!='D')&&(x!='.')&&(x!='I')&&(x!='O')&&(x!='*'))
      continue;
    t++;
    a[i][j]=x;

    if (x=='I') {
      x1=i;y1=j;
    } else
    if (x=='O') {
      x2=i;y2=j;
    }


    if (j<m) j++;
    else {
      i++;
      j=1;
    }
  }
  fclose(f);

  for (i=0;i<=n+1;i++)
    for (j=0;j<=m+1;j++)
      d[i][j]=DIM;

  for (i=1;i<=n;i++)
    for (j=1;j<=m;j++) {
      if (a[i][j]=='D') {
	d[i][j]=0;
	//stanga
	t=j;dst=0;
	while ((t-1>=1)&&((a[i][t-1]=='.')||(a[i][t-1]=='I')||(a[i][t-1]=='O'))) {
	  t--;
	  dst++;
	  if (d[i][t]>dst+1)
	    d[i][t]=dst;
	}
	//dreapta
	t=j;dst=0;
	while ((t+1<=m)&&((a[i][t+1]=='.')||(a[i][t+1]=='I')||(a[i][t+1]=='O'))) {
	  t++;
	  dst++;
	  if (d[i][t]>dst+1)
	    d[i][t]=dst;
	}
	//sus
	t=i;dst=0;
	while ((t-1>0)&&((a[t-1][j]=='.')||(a[t-1][j]=='I')||(a[t-1][j]=='O'))) {
	  t--;
	  dst++;
	  if (d[t][j]>dst+1)
	    d[t][j]=dst;
	}
	//jos
	t=i;dst=0;
	while ((t+1<=n)&&((a[t+1][j]=='.')||(a[t+1][j]=='I')||(a[t+1][j]=='O'))) {
	  t++;
	  dst++;
	  if (d[t][j]>dst+1)
	    d[t][j]=dst;
	}
      }
    }


  FILE *g = fopen("barbar.out","w");
  int s;
//  s = parc(3);


  if (parc(0)==0){
    fprintf(g,"-1");
  } else {

    pr=0;
    ul=DIM;
    while (pr<=ul) {
      mij = (pr+ul)/2;
      if (parc(mij))
	pr=mij+1;
      else
	ul=mij-1;
    }
    if (parc(ul))
      fprintf(g,"%d",ul);
    else
      fprintf(g,"%d",pr);
  }

  fclose(g);
  return 0;
}