Cod sursa(job #2921642)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 1 septembrie 2022 10:40:39
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#define M1  1005
#define M2  1000005
#define INF 1000000
const int dx[4]={0, 0, -1, 1}, dy[4]={-1, 1, 0, 0};
int minim(int a, int b){
  return a<b?a:b;
}
int n, m, i, j, m1[M1][M1], m2[M1][M1], xi, yi, xf, yf, x0, y0, x1, y1, cx[M2], cy[M2], cs, cd;
char t[M1][M1];
int main(){
  freopen("barbar.in", "r", stdin);
  freopen("barbar.out", "w", stdout);
  scanf("%d %d\n", &n, &m);
  cs=0;
  cd=-1;
  for(i=1; i<=n; i++){
    for(j=1; j<=m; j++){
      m1[i][j]=INF;
      m2[i][j]=0;
      t[i][j]=fgetc(stdin);
      if(t[i][j]=='D'){
        m1[i][j]=0;
        cd++;
        cx[cd]=i;
        cy[cd]=j;
      }
      if(t[i][j]=='I'){
        xi=i;
        yi=j;
      }
      if(t[i][j]=='O'){
        xf=i;
        yf=j;
      }
    }
    scanf("\n");
  }
  for(i=0; i<=n+1; i++){
    t[i][0]='*';
    t[i][m+1]='*';
  }
  for(i=0; i<=m+1; i++){
    t[0][i]='*';
    t[n+1][i]='*';
  }
  while(cs!=cd+1){
    for(i=0; i<4; i++){
      x0=cx[cs];
      y0=cy[cs];
      x1=x0+dx[i];
      y1=y0+dy[i];
      if(t[x1][y1]!='*' && m1[x1][y1]>m1[x0][y0]+1){
        m1[x1][y1]=m1[x0][y0]+1;
        cd=(cd+1)%M2;
        cx[cd]=x1;
        cy[cd]=y1;
      }
    }
    cs=(cs+1)%M2;
  }
  cs=cd=0;
  cx[0]=xi;
  cy[0]=yi;
  m2[xi][yi]=m1[xi][yi];
  while(cs!=cd+1){
    for(i=0; i<4; i++){
      x0=cx[cs];
      y0=cy[cs];
      x1=x0+dx[i];
      y1=y0+dy[i];
      if(t[x1][y1]!='*'){
        xi=minim(m2[x0][y0], m1[x1][y1]);
        if(m2[x1][y1]<xi){
          m2[x1][y1]=xi;
          cd=(cd+1)%M2;
          cx[cd]=x1;
          cy[cd]=y1;
        }
      }
    }
    cs=(cs+1)%M2;
  }
  if(m2[xf][yf]>0)
    printf("%d\n", m2[xf][yf]);
  else
    printf("-1\n");
  return 0;
}