Cod sursa(job #2601777)

Utilizator alex_benescuAlex Ben alex_benescu Data 15 aprilie 2020 10:22:12
Problema A+B Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>
#define L 1002
char m[L][L];
int d[L][L], v[L*L][2], l, c;
int nrz(){
  int i, j, r, x;
  r=0;
  for(i=1; i<=l; i++)
    for(j=1; j<=c; j++)
      if(d[i][j]==0)
        r++;
  if(r==0)
    x=1;
  else
    x=0;
  return x;
}
int main(){
  FILE *fin, *fout;
  int i, j, dis, k, x, y, x1, y1, f, dd, dt;
  fin=fopen("dwarfland.in", "r");
  fout=fopen("dwarfland.out", "w");
  fscanf(fin, "%d%d ", &l, &c);
  for(i=1; i<=l; i++){
    for(j=1; j<=c; j++)
      m[i][j]=fgetc(fin);
    fgetc(fin);
  }
  for(i=0; i<l+2; i++)
    m[i][0]=m[i][c+1]='Z';
  for(j=0; j<c+2; j++)
    m[0][j]=m[l+1][j]='Z';
  for(i=1; i<=l; i++)
    for(j=1; j<=c; j++)
      if(m[i][j]=='A'){
        x1=i;
        y1=j;
      }
  j=f=d[x1][y1]=0;
  v[0][0]=x1;
  v[0][1]=y1;
  dis=i=1;
  while(nrz()==0){
    k=0;
    for(; j<i; j++){
      x=v[j][0];
      y=v[j][1];
      if(m[x-1][y]!='Z'){
        if(m[x-1][y]=='D')
          dd=dis;
        if(m[x-1][y]=='A' && f==0){
          dt=dis;
          f=1;
        }
        d[x-1][y]=dis;
        v[k+i][0]=x-1;
        v[k+i][1]=y;
        k++;
      }
      if(m[x+1][y]!='Z'){
        if(m[x+1][y]=='D')
          dd=dis;
        if(m[x+1][y]=='A' && f==0){
          dt=dis;
          f=1;
        }
        d[x+1][y]=dis;
        v[k+i][0]=x+1;
        v[k+i][1]=y;
        k++;
      }
      if(m[x][y-1]!='Z'){
        if(m[x][y-1]=='D')
          dd=dis;
        if(m[x][y-1]=='A' && f==0){
          dt=dis;
          f=1;
        }
        d[x][y-1]=dis;
        v[k+i][0]=x;
        v[k+i][1]=y-1;
        k++;
      }
      if(d[x][y+1]!='Z'){
        if(m[x][y+1]=='D')
          dd=dis;
        if(m[x][y+1]=='A' && f==0){
          dt=dis;
          f=1;
        }
        d[x][y+1]=dis;
        v[k+i][0]=x;
        v[k+i][1]=y+1;
        k++;
      }
    }
    j=i;
    i+=k;
    dis++;
  }
  fprintf(fout, "%d\n", dd+dt);
  fclose(fin);
  fclose(fout);
  return 0;
}