Cod sursa(job #96105)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 31 octombrie 2007 14:10:05
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<stdio.h>

int a[1000][1000], n, m, x1, y1, x2, y2, nr, b[1000][1000];
int dx[4]={0,1,0,-1}, dy[4]={1,0,-1,0};

typedef struct
{
  int x, y;
} Coada;

Coada c[100000];

void citire()
{
  freopen("barbar.in","r",stdin);
  freopen("barbar.out","w",stdout);
  scanf("%d %d",&n,&m);
  int i, j;
  char x;
  scanf("\n");
  for (i=1; i<=n; i++)
  {
    for (j=1; j<=m; j++)
    {
      scanf("%c",&x);
      switch(x)
      {
	case '.' : {a[i][j]=-1; break;}
	case '*' : {a[i][j]=-2; break;}
	case 'D' : {a[i][j]=0; c[++nr].x=i; c[nr].y=j;break;}
	case 'I' : {x1=i, y1=j, a[i][j]=-1; break;}
	case 'O' : {x2=i, y2=i, a[i][j]=-1; break;}
      }
    }
    scanf("\n");
  }
  for (i=1; i<=n; i++) a[i][0]=a[i][m+1]=-2;
  for (i=1; i<=m; i++) a[0][i]=a[n+1][i]=-2;
}

void parcurg()
{
  int p, u, x, y, i;
  p=1;
  u=nr;
  while (p<=u)
  {
    for (i=0; i<4; i++)
    {x=c[p].x+dx[i];
    y=c[p].y+dy[i];
    if (a[x][y]!=-2)
    {
      if (a[x][y]==-1 || a[x][y]>a[c[p].x][c[p].y]+1)
      {
	u++;
	c[u].x=x;
	c[u].y=y;
	a[x][y]=a[c[p].x][c[p].y]+1;
      }
    }
    }
    p++;
  }
}


int verif (int dist)
{
  int p, u, x, y, i;
  p=1;
  u=1;
  c[1].x=x1; c[1].y=y1;
  while (p<=u)
  {
    for (i=0; i<4; i++)
    {x=c[p].x+dx[i];
    y=c[p].y+dy[i];
    if (a[x][y]!=-2)
    {
      if (a[x][y]>=dist && b[x][y]!=dist)
      {
	u++;
	c[u].x=x;
	c[u].y=y;
	b[x][y]=dist;
	if (x==x2 && y==y2) return 1;
      }
    }
    }
    p++;
  }
  return 0;
}


void afis()
{
  int i, j;
  for (i=1; i<=n; i++)
  {
    for (j=1; j<=m; j++)
      printf("%3.d",a[i][j]);
    printf("\n");
  }
}


int main()
{
  citire();
  parcurg();
  int i;
  for (i=10; i>=0; i--) if (verif(i)) {printf("%d",i); break;}
  if (i==-1) printf("%d",i);
  return 0;
}