Cod sursa(job #2074226)

Utilizator herbertoHerbert Mohanu herberto Data 24 noiembrie 2017 11:27:47
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<bits/stdc++.h>
using namespace std;

#define MAXN 1001
int v[MAXN][MAXN], f[MAXN][MAXN], drum[MAXN][MAXN], q[MAXN*MAXN][2];
int dirl[5]={0, -1, 0, 1,  0};
int dirc[5]={0,  0, 1, 0, -1};
void bfs(int st, int dr){
  int i;
  int l, c, lin, col;
  while(st<=dr){
    l=q[st][0];
    c=q[st][1];
    st++;
    for(i=1; i<=4; i++){
      lin=l+dirl[i]; col=c+dirc[i];
      if(v[lin][col]!=-1 && f[lin][col]==0){
        drum[lin][col]=drum[l][c]+1;
        dr++;
        q[dr][0]=lin; q[dr][1]=col;
        f[lin][col]=1;
      }
    }
  }
}
int main(){
  FILE*fin=fopen("barbar.in", "r");
  FILE*fout=fopen("barbar.out", "w");
  int n, m, i, j, drag, sl, sc, fl, fc;
  int maxim, left, right, dist, ans, st, dr, ok;
  int l, c, lin, col;
  char ch;
  fscanf(fin, "%d%d", &n, &m);
  fgetc(fin);
  drag=0;
  for(i=1; i<=n; i++){
    for(j=1; j<=m; j++){
      ch=fgetc(fin);
      if(ch=='*'){
        v[i][j]=-1;
        drum[i][j]=-1;
      }
      if(ch=='I'){
        sl=i;
        sc=j;
      }
      if(ch=='D'){
        drag++;
        q[drag][0]=i;
        q[drag][1]=j;
        f[i][j]=1;
      }
      if(ch=='O'){
        fl=i;
        fc=j;
      }

    }
    fgetc(fin);
  }
  for(i=0; i<=n+1; i++)
    v[i][0]=v[i][m+1]=-1;
  for(j=0; j<=m+1; j++)
    v[0][j]=v[n+1][j]=-1;

  bfs(1, drag);
  maxim=0;
  for(i=1; i<=n; i++)
    for(j=1; j<=m; j++){
      f[i][j]=0;
      if(drum[i][j]>maxim)
        maxim=drum[i][j];
    }
  left=0; right=maxim+10;
  ans=-1;
  while(left<=right){
    dist=(left+right)/2;
    q[1][0]=sl; q[1][1]=sc;
    f[sl][sc]=1;
    st=1; dr=1;
    ok=0;
    while(st<=dr && ok==0){
      l=q[st][0];
      c=q[st][1];
      for(i=1; i<=4; i++){
        lin=l+dirl[i]; col=c+dirc[i];
        if(v[lin][col]!=-1 && f[lin][col]==0 && drum[lin][col]>=dist){
          dr++;
          q[dr][0]=lin; q[dr][1]=col;
          f[lin][col]=1;
        }
      }
      st++;
    }
    if(f[fl][fc]==1){
      ans=dist;
      left=dist+1;
    }
    else{
      right=dist-1;
    }
    for(i=1; i<=n; i++)
      for(j=1; j<=m; j++)
        f[i][j]=0;

  }

  fprintf(fout, "%d", ans);
  return 0;
}