Cod sursa(job #1866208)

Utilizator Mstar_AngelComan Mara Stefania Mstar_Angel Data 2 februarie 2017 18:59:58
Problema Barbar Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.79 kb
#include<stdio.h>
#define NMAX 1005
#define INITMAX 2005
#define GOL 1// sa nu coincida cu 0 care v-a fi bordura matr
#define OBS 2
#define FIRE 3
#define POZ1 4
#define POZ2 5
char a[NMAX][NMAX];
struct poz{
  int l,c;
} stiv[NMAX*NMAX]; // ?? "<"
int viz[NMAX][NMAX];
int sol[NMAX][NMAX];
const int dirlin[] = {-1,0,1,0};
const int dircol[] = {0,1,0,-1};
int main (){
  FILE *in, *out;
  in = fopen ("barbar.in","r");
  out = fopen ("barbar.out","w");
  int n,m,i,j,l1,c1,l2,c2,lin,col;
  int inc,sf,minim;
  char c;

  fscanf (in,"%d%d",&n,&m);

  for (i=1;i<=n;i++)
    for (j=1;j<=m;j++)
      viz[i][j] = -1;

  inc = 1; sf = 0; // coada "stiv"

  for (i=1;i<=n;i++){
    fscanf (in," ");
    for (j=1;j<=m;j++){
      c = fgetc (in);
      if (c == '.')
        a[i][j] = GOL;
      else if (c == '*')
        a[i][j] = OBS;
      else if (c == 'D'){
        a[i][j] = FIRE;
        sf ++;
        stiv[sf].l = i; stiv[sf].c = j;
        viz[i][j] = 0;
      }
      else if (c == 'I'){
        l1 = i;c1 = j;
        a[i][j] = POZ1;
      }
      else if (c == 'O'){
        l2 = i;c2 = j;
        a[i][j] = POZ2;
      }
    }
  }

  /// inc = 1; sf
  while (inc <= sf){// in matr viz vor aparea dist pana cel mai apropiat dragon
    lin = stiv[inc].l; col = stiv[inc].c;
    for (i=0;i<4;i++){
      if (a[lin+dirlin[i]][col+dircol[i]] == GOL)
        if (viz[lin+dirlin[i]][col+dircol[i]] == -1){
          viz[lin+dirlin[i]][col+dircol[i]] = viz[lin][col] + 1;
          sf ++;
          stiv[sf].l = lin+dirlin[i]; stiv[sf].c = col+dircol[i];
        }
    }
    inc ++;
  }


  for (i=1;i<=n;i++)
    for (j=1;j<=m;j++)
      sol[i][j] = INITMAX;

  viz[l1][c1] = viz[l2][c2] = INITMAX;
  inc = sf = 1;
  stiv[inc].l = l1; stiv[inc].c = c1;
  while (inc <= sf){
    lin = stiv[inc].l; col = stiv[inc].c;
    for (i=0;i<4;i++){
      if (viz[lin+dirlin[i]][col+dircol[i]] != 0)//diferit de dragon si diferit de bordura
        if (viz[lin+dirlin[i]][col+dircol[i]] != -1){
          minim = sol[lin][col] < viz[lin+dirlin[i]][col+dircol[i]] ? sol[lin][col] : viz[lin+dirlin[i]][col+dircol[i]];
          if (sol[lin+dirlin[i]][col+dircol[i]] == INITMAX){
            sol[lin+dirlin[i]][col+dircol[i]] = minim;// cel mai apropiat dargon pe trasel pana in punctul asta
            sf ++;
            stiv[sf].l = lin + dirlin[i]; stiv[sf].c = col + dircol[i];
          }
          else
            sol[lin+dirlin[i]][col+dircol[i]] = sol[lin+dirlin[i]][col+dircol[i]] > minim ? sol[lin+dirlin[i]][col+dircol[i]] : minim;//alegem dist de pe traseul mai bun

        }
    }
    inc ++;
  }

  if (sol[l2][c2] == INITMAX)
    fprintf (out,"-1");
  else
    fprintf (out,"%d",sol[l2][c2]);


  fclose (in);
  fclose (out);
  return 0;
}