Cod sursa(job #176104)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 10 aprilie 2008 19:03:44
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
using namespace std;
fstream in,out;
int r,c;
int i,j,k;
int m[1001][1001];
int b[1001][1001];
int di[1000001],dj[1000001],ds[1000001];
long d=0,t;
int x,y,x1,y1;
int l,h,ma;
int max;
int suma;
char v[100];

void afiseaza()
  {
  int i,j;
  for(i=1;i<=r;i++)
    {
    for(j=1;j<=c;j++)
      out<<m[i][j]<<" ";
    out<<endl;
    }
  }

int nr_max(int i,int j)
  {
  int x=0;
  if(i>1 && m[i-1][j]>x) x=m[i-1][j];
  if(j>1 && m[i][j-1]>x) x=m[i][j-1];
  if(i<r && m[i+1][j]>x) x=m[i+1][j];
  if(j<c && m[i][j+1]>x) x=m[i][j+1];
  return x;
  }
int nr_min(int x,int y)
  {
  if(x>y) return y;
  else return x;
  }
void umple(int i,int j,int k)
  {
  if(i>1 && m[i-1][j]>=k && b[i-1][j]==0) { b[i-1][j]=1; umple(i-1,j,k); }
  if(j>1 && m[i][j-1]>=k && b[i][j-1]==0) { b[i][j-1]=1; umple(i,j-1,k); }
  if(i<r && m[i+1][j]>=k && b[i+1][j]==0) { b[i+1][j]=1; umple(i+1,j,k); }
  if(j<c && m[i][j+1]>=k && b[i][j+1]==0) { b[i][j+1]=1; umple(i,j+1,k); }
  }
void goleste()
  {
  int i,j;
  for(i=1;i<=r;i++)
    for(j=1;j<=c;j++)
      b[i][j]=0;
  }

void main(void)
{
in.open("barbar.in",ios::in);
out.open("barbar.out",ios::out);
in>>r>>c;
in.get();
for(i=1;i<=r;i++)
  {
  in.getline(v,c+2,'\n');
  for(j=0;j<c;j++)
    {
    if(v[j]=='.') m[i][j+1]=30000;
    else if(v[j]=='*') m[i][j+1]=0;
    else if(v[j]=='D')
      {
      m[i][j+1]=0;
      d++;
      di[d]=i;
      dj[d]=j+1;
      }
    else if(v[j]=='I')
      {
      m[i][j+1]=30000;
      x=i;
      y=j+1;
      }
    else
      {
      m[i][j+1]=30000;
      x1=i;
      y1=j+1;
      }
    }
  }
in.close();
t=d;
for(i=1;i<=t;i++)
  {
  suma = m[di[i]][dj[i]]+1;
  if(di[i]>1 && m[di[i]-1][dj[i]] > suma)
    {
    m[di[i]-1][dj[i]] = suma;
    t++;
    di[t]=di[i]-1;
    dj[t]=dj[i];
    }
  if(di[i]<r && m[di[i]+1][dj[i]] > suma)
    {
    m[di[i]+1][dj[i]] = suma;
    t++;
    di[t]=di[i]+1;
    dj[t]=dj[i];
    }
  if(dj[i]>1 && m[di[i]][dj[i]-1] > suma)
    {
    m[di[i]][dj[i]-1] = suma;
    t++;
    di[t]=di[i];
    dj[t]=dj[i]-1;
    }
  if(dj[i]<c && m[di[i]][dj[i]+1] > suma)
    {
    m[di[i]][dj[i]+1] = suma;
    t++;
    di[t]=di[i];
    dj[t]=dj[i]+1;
    }
  }
max=nr_min(nr_max(x,y),nr_max(x1,y1));
k=-1;
l=1;
h=max;
while(l<=h)
  {
  ma=(l+h)/2;
  umple(x,y,ma);
  if(b[x1][y1]==1)
    {
    k=ma;
    l=ma+1;
    }
  else
    h=ma-1;
  goleste();
  }
out<<k<<endl;
out.close();
}