Cod sursa(job #93297)

Utilizator adalLica Adela adal Data 18 octombrie 2007 13:50:41
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <stdio.h>
#include <values.h>
#include <algorithm>
using namespace std;
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,x,y,i,l,u,r,t,j;
 
  p=1; i=0; l=1; u=b[i][0].s;
 
 while (u>0) {
 
   b[l][0].s=0;
   
   for (p=1; p<=u; p++)
     for (j=0; j<=3; j++) {
       r=dx[j]; t=dy[j]; x=b[i][p].s; y=b[i][p].d;
       if (a[x+r][y+t] > (a[x][y]+1)) {
          nr=++b[l][0].s;
          b[l][nr].s=x+r;
          b[l][nr].d=y+t;
          a[x+r][y+t]=a[x][y]+1;
        }
     }
   aux=i; i=l; l=aux;
   p=1; u=b[i][0].s;
  }
}

void lee2()
{

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

int main()
{
  fscanf(f,"%d %d\n", &n, &m);
  memset(a, 0xff, sizeof(a));
  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] = (rec) { i, 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=='O') {xf=i; yf=j; }
      }
    }
    fscanf(f,"\n");
  }
  lee1();
  c[xf][yf]=-1;
  lee2();

  fprintf(g,"%ld\n", c[xf][yf]);
  return 0;
}