Cod sursa(job #91029)

Utilizator adalLica Adela adal Data 11 octombrie 2007 11:33:23
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <stdio.h>
#include <values.h>
FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");

struct rec{ int s,d;} b[2][3000005];


int dx[] = {0, 0, -1, 1},
    dy[] = {-1,1,  0, 0};
int a[1003][1003],c[1003][1003],xi,yi,xf,yf,n,m,i,j;
char x;


void lee1()
{
 int p,aux,nr,i,l,u,r,t,j;
 
  p=1; i=0; l=2; u=b[i][0].s;
 
 while (p<=u) {
 
   b[l][0].s=0;
   
   for (p=1; p<=u; p++)
     for (j=0; j<=3; j++) {
       r=dx[j]; t=dy[j];
       if (a[b[i][p].s+r][b[i][p].d+t]>(a[b[i][p].s][b[i][p].d]+1)) {
          ++b[l][0].s; nr=b[l][0].s;
          b[l][nr].s=b[i][p].s+r;
          b[l][nr].d=b[i][p].d+t;
          a[b[i][p].s+r][b[i][p].d+t]=a[b[i][p].s][b[i][p].d]+1;
        }
     }
   aux=i; i=l; l=aux;
   p=1; u=b[i][0].s;
  }
}

void lee2()
{

 int p,aux,nr,i,l,u,r,t,j;
 
  p=1; i=0; l=2; u=1;
  b[i][0].s=1; b[i][1].s=xi; b[i][1].d=yi;
  c[xi][yi]=a[xi][yi];
 while (p<=u) {
 
   b[l][0].s=0;
   
   for (p=1; p<=u; p++)
     for (j=0; j<=3; j++) {
       r=dx[j]; t=dy[j];
       if ((b[i][p].s+r>0)&&(b[i][p].s+r<=n)&&(b[i][p].d+t>0)&&(b[i][p].d+t<=m)) {
          if (c[b[i][p].s+r][b[i][p].d+t]==0) {
            c[b[i][p].s+r][b[i][p].d+t]=c[b[i][p].s][b[i][p].d];
            if (c[b[i][p].s+r][b[i][p].d+t]>a[b[i][p].s+r][b[i][p].d+t]) c[b[i][p].s+r][b[i][p].d+t]=a[b[i][p].s+r][b[i][p].d+t];
            else;
            ++b[l][0].s; nr=b[l][0].s;
            b[l][nr].s=b[i][p].s+r;
            b[l][nr].d=b[i][p].d+t;
          }
          else if ((a[b[i][p].s+r][b[i][p].d+t]>=c[b[i][p].s][b[i][p].d])&&(c[b[i][p].s+r][b[i][p].d+t]<c[b[i][p].s][b[i][p].d])){
            ++b[l][0].s; nr=b[l][0].s;
            b[l][nr].s=b[i][p].s+r;
            b[l][nr].d=b[i][p].d+t;
            c[b[i][p].s+r][b[i][p].d+t]=c[b[i][p].s][b[i][p].d];
          }
        }
     }
   aux=i; i=l; l=aux;
   p=1; u=b[i][0].s;
  }
}

int main()
{
  fscanf(f,"%d %d\n", &n, &m);
  for (i=0; i<=n+1; i++)
   for (j=0; j<=n+1; j++) a[i][j]=-1;
   
  for (i=1; i<=n; i++) {
    for (j=1; j<=m; j++) {
      fscanf(f,"%c",&x);
      if (x=='D') { b[0][++b[0][0].s].s=i; b[0][b[0][0].s].d=j;  a[i][j]=0;}
      else if (x=='*') a[i][j]=-1;
      else {
        a[i][j]=INT_MAX;
        if (x=='I') {xi=i; yi=j; };
        if (x=='0') {xf=i; yf=j; }
      }
    }
    fscanf(f,"\n");
  }
  lee1();
  for (i=0; i<=n+1; i++)
   for (j=0; j<=n+1; j++) c[i][j]=0;
  
  lee2();
 fprintf(g,"%ld", c[xf][yf]);
    return 0;
}