Cod sursa(job #170374)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 2 aprilie 2008 18:09:06
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <fstream>
using namespace std;
fstream in,out;
int r,c;
int i,j,k;
int m[1001][1001];
int ma[1001][1001];
int di[1000001],dj[1000001],ds[1000001],d=0;
int x,y,x1,y1;
int suma;
char v[1000];

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

int main()
{
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]=10000;
    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]=0;
      x=i;
      y=j+1;
      }
    else
      {
      m[i][j+1]=-1;
      x1=i;
      y1=j+1;
      }
    }
  }
in.close();

for(i=1;i<=d;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;
    d++;
    di[d]=di[i]-1;
    dj[d]=dj[i];
    }
  if(di[i]<r && m[di[i]+1][dj[i]] > suma)
    {
    m[di[i]+1][dj[i]] = suma;
    d++;
    di[d]=di[i]+1;
    dj[d]=dj[i];
    }
  if(dj[i]>1 && m[di[i]][dj[i]-1] > suma)
    {
    m[di[i]][dj[i]-1] = suma;
    d++;
    di[d]=di[i];
    dj[d]=dj[i]-1;
    }
  if(dj[i]<c && m[di[i]][dj[i]+1] > suma)
    {
    m[di[i]][dj[i]+1] = suma;
    d++;
    di[d]=di[i];
    dj[d]=dj[i]+1;
    }
  }

d=1;
di[1]=x;
dj[1]=y;
ds[1]=10000;
for(i=1;i<=d;i++)
  {
  if(di[i]>1 && m[di[i]-1][dj[i]] != 0 && ma[di[i]-1][dj[i]]==0)
    {
    ma[di[i]-1][dj[i]] = 1;
    if(ds[i] < m[di[i]-1][dj[i]] | m[di[i]-1][dj[i]] == -1) m[di[i]-1][dj[i]]=ds[i];
    d++;
    di[d]=di[i]-1;
    dj[d]=dj[i];
    ds[d]=m[di[i]-1][dj[i]];
    }
  if(di[i]<r && m[di[i]+1][dj[i]] != 0 && ma[di[i]+1][dj[i]]==0)
    {
    ma[di[i]+1][dj[i]] = 1;
    if(ds[i] < m[di[i]+1][dj[i]] || m[di[i]+1][dj[i]] == -1) m[di[i]+1][dj[i]]=ds[i];
    d++;
    di[d]=di[i]+1;
    dj[d]=dj[i];
    ds[d]=m[di[i]+1][dj[i]];
    }
  if(dj[i]>1 && m[di[i]][dj[i]-1] != 0 && ma[di[i]][dj[i]-1]==0)
    {
    ma[di[i]][dj[i]-1] = 1;
    if(ds[i] < m[di[i]][dj[i]-1] || m[di[i]][dj[i]-1] == -1) m[di[i]][dj[i]-1]=ds[i];
    d++;
    di[d]=di[i];
    dj[d]=dj[i]-1;
    ds[d]=m[di[i]][dj[i]-1];
    }
  if(dj[i]<c && m[di[i]][dj[i]+1] != 0 && ma[di[i]][dj[i]+1]==0)
    {
    ma[di[i]][dj[i]+1] = 1;
    if(ds[i] < m[di[i]][dj[i]+1] || m[di[i]][dj[i]+1] == -1) m[di[i]][dj[i]+1]=ds[i];
    d++;
    di[d]=di[i];
    dj[d]=dj[i]+1;
    ds[d]=m[di[i]][dj[i]+1];
    }
  }
out<<m[x1][y1]<<endl;
//afiseaza();
out.close();
return 0;
}