Cod sursa(job #364698)

Utilizator zloteanu.adrianzloteanu adrian nichita zloteanu.adrian Data 16 noiembrie 2009 19:28:40
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
//barbar3
#include<fstream.h>
int main()
{int r1,r2,s,c1,c2,a,j,f,i=1,lmax,n,n2,nd=0,lee1[1000001],lee2[1000001];  //00
char m[1001][1001];  //0
int d[1001][1001],b[1001][1001];
ifstream q("barbar.in");
ofstream w("barbar.out");
q>>n>>n2;
for(i=1;i<=n;i++)
  {q>>m[i];
  for(j=1;j<=n2;j++)
    {d[i][j]=0;
    b[i][j]=0;
    if(m[i][j]=='D')
     {nd++;
     lee1[nd]=i;
     lee2[nd]=j;}
  if(m[i][j]=='I')
   {c1=i;
   c2=j;}
  if(m[i][j]=='O')
   {r1=i;
   r2=j;}}}
lmax=nd-1;
 d[lee1[1]][lee2[1]]=0;
 for(a=1;a<=lmax;a++)
   {i=lee1[a];
   j=lee2[a];
   if(i>1&&m[i-1][j]!='*'&&(d[i-1][j]==0||d[i-1][j]>d[i][j]+1))
    {d[i-1][j]=d[i][j]+1;
    lmax++;
    lee1[lmax]=i-1;
    lee2[lmax]=j;}
   if(j>1&&m[i][j-1]!='*'&&(d[i][j-1]==0||d[i][j-1]>d[i][j]+1))
    {d[i][j-1]=d[i][j]+1;
    lmax++;
    lee1[lmax]=i;
    lee2[lmax]=j-1;}
   if(i<n&&m[i+1][j]!='*'&&(d[i+1][j]==0||d[i+1][j]>d[i][j]+1))
    {d[i+1][j]=d[i][j]+1;
     lmax++;
    lee1[lmax]=i+1;
   lee2[lmax]=j;}
   if(j<n&&m[i][j+1]!='*'&&(d[i][j+1]==0||d[i][j+1]>d[i][j]+1))
    {d[i][j+1]=d[i][j]+1;
     lmax++;
     lee1[lmax]=i;
     lee2[lmax]=j+1;}}
lee1[1]=c1;
lee2[1]=c2;
int nr,in=1;
s=n;
while(in<s)
  {nr=in-1+((s-in+1)/2);
  lmax=1;
  for(d[0][0]=1;d[0][0]<=n;d[0][0]++)
    for(d[0][1]=1;d[0][1]<=n2;d[0][1]++)
      b[d[0][0]][d[0][1]]=0;
  for(a=1;a<=lmax;a++)
    {i=lee1[a];
    j=lee2[a];
    if(i>1&&(d[i-1][j]>=nr||d[i][j-1]==0)&&(m[i-1][j]=='.'||m[i][j+1]=='O')&&(b[i-1][j]==0||b[i-1][j]>b[i][j]+1))
     {b[i-1][j]=b[i][j]+1;
     lmax++;
     lee1[lmax]=i-1;
     lee2[lmax]=j;}
    if(j>1&&(d[i][j-1]>=nr||d[i][j-1]==0)&&(m[i][j-1]=='.'||m[i][j+1]=='O')&&(b[i][j-1]==0||b[i][j-1]>b[i][j]+1))
     {b[i][j-1]=b[i][j]+1;
     lmax++;
     lee1[lmax]=i;
     lee2[lmax]=j-1;}
    if(i<n&&(d[i+1][j]>=nr||d[i+1][j]==0)&&(m[i+1][j]=='.'||m[i][j+1]=='O')&&(b[i+1][j]==0||b[i+1][j]>b[i][j]+1))
     {b[i+1][j]=b[i][j]+1;
     lmax++;
     lee1[lmax]=i+1;
     lee2[lmax]=j;}
    if(j<n&&(d[i][j+1]>=nr||d[i][j+1]==0)&&(m[i][j+1]=='.'||m[i][j+1]=='O')&&(b[i][j+1]==0||b[i][j+1]>b[i][j]+1))
     {b[i][j+1]=b[i][j]+1;
     lmax++;
     lee1[lmax]=i;
     lee2[lmax]=j+1;}}
  if(b[r1][r2]!=0)
   {in=nr+1;}
  if(b[r1][r2]==0)
   s=nr-1;}
if(in>s)
w<<s;
else
w<<nr;
return 0;}