Cod sursa(job #2292297)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 29 noiembrie 2018 12:35:33
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int N=15;
const int BORD=1;
int dl[]={-1,0,1,0};
int dc[]={0,1,0,-1};
struct poz{
  int lin,col;
  bool operator == (poz x) const{
    if(x.lin==lin && x.col==col)
      return true;
    return false;
  }
};
bool mat[N][N];
poz q[N*N];
poz drag[N*N];
int distdr[N][N];
bool viz[N][N];
poz start,finish;
poz x,y;
int n,m;


void bordam(bool v[N][N],int nn,int mm){
  for(int i=0;i<=nn+1;i++){
    v[i][mm]=v[i][0]=BORD;
  }
  for(int j=0;j<=mm+1;j++){
    v[nn][j]=v[0][j]=BORD;
  }
}


bool verif(poz a,int dist){
  if(distdr[a.lin][a.col]>=dist)
    return true;
  return false;
}

bool check(int dist){
  memset(q,0,sizeof(q));
  memset(viz,0,sizeof(viz));
  bordam(viz,n,m);
  int st=1,dr=0;
  q[++dr]=start;
  while(st<=dr){
    x=q[st];
    if(x==finish){
      return true;
    }
    viz[x.lin][x.col]=true;
    for(int i=0;i<4;i++){
      y.col=x.col+dc[i];
      y.lin=x.lin+dl[i];
      if(mat[y.lin][y.col]==0 && viz[y.lin][y.col]==0 && verif(y,dist)){
        q[++dr]=y;
      }
    }
    st++;
  }
  return false;
}
int cautbin(){
  int pas=0,p2=1<<15;
  while(p2>0){
    if(check(pas+p2)){
      pas+=p2;
    }
    p2/=2;
  }
  return pas;
}
int main()
{
    FILE*fin,*fout;
    fin=fopen("barbar.in","r");
    fout=fopen("barbar.out","w");
    int i,j;
    int stdr=1,drdr=0;
    char c;
    fscanf(fin,"%d%d ",&n,&m);
    for(i=1;i<=n;i++){
      for(j=1;j<=m;j++){
        c=fgetc(fin);
        if(c=='D'){
          drag[++drdr].lin=i;
          drag[drdr].col=j;
          mat[i][j]=1;
        }
        else if(c=='I'){
          start.lin=i;
          start.col=j;
          mat[i][j]=0;
        }
        else if(c=='O'){
          finish.lin=i;
          finish.col=j;
          mat[i][j]=0;
        }
        else if(c=='*'){
          mat[i][j]=1;
        }
        else{
          mat[i][j]=0;
        }
      }
      fgetc(fin);
    }
    bordam(mat,n,m);
    poz a,b;
    while(stdr<=drdr){
      a=drag[stdr++];
      for(i=0;i<4;i++){
        b.lin=a.lin+dl[i];
        b.col=a.col+dc[i];
        if(mat[b.lin][b.col]==0 && distdr[b.lin][b.col]==0){
          distdr[b.lin][b.col]=distdr[a.lin][a.col]+1;
          drag[++drdr]=b;
        }
      }
    }
    int rez;
    rez=cautbin();
    if(rez==0){
      fprintf(fout,"-1");
      return 0;
    }
    fprintf(fout,"%d",rez);
    return 0;
}