Cod sursa(job #2076717)

Utilizator AnduRazvanMindrescu Andu AnduRazvan Data 26 noiembrie 2017 23:36:56
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char c;
int xs,ys,xf,yf,n,m,a[1002][1002],b[1002][1002],cx[1000001],cy[1000001];
int pr,ul,s,d,mij;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void LEE()
{ pr=1;int i,xc,yc,xv,yv;
    while(pr<=ul)
      { xc=cx[pr];
        yc=cy[pr];
         for(i=0;i<=3;i++)
          {xv=xc+dx[i];
           yv=yc+dy[i];
           if(xv>=1&&xv<=n&&yv>=1&&yv<=m)
             if(a[xv][yv]==0)
               { if(a[xc][yc]==-2) {a[xv][yv]=1;ul++;cx[ul]=xv;cy[ul]=yv;}
                 else {a[xv][yv]=a[xc][yc]+1;ul++;cx[ul]=xv;cy[ul]=yv;}
               }
          }
          pr++;
      }
}
int viz[1001][1001];
int le(int val)
{   pr=ul=1;int j,i,xc,yc,xv,yv;
   for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
     viz[i][j]=0;
    cx[pr]=xs;
    cy[pr]=ys;
    viz[xs][ys]=1;
    while(pr<=ul)
      { xc=cx[pr];
        yc=cy[pr];
         for(i=0;i<=3;i++)
          {xv=xc+dx[i];
           yv=yc+dy[i];
           if(xv>=1&&xv<=n&&yv>=1&&yv<=m)
             if((a[xv][yv]>=val||a[xv][yv]==-4)&&(a[xv][yv]>0||a[xv][yv]==-4)&&viz[xv][yv]==0)
               { if(a[xv][yv]==-4) return 1;
                 else {viz[xv][yv]=1;ul++;cx[ul]=xv;cy[ul]=yv;}
               }
          }
          pr++;
      }
     return 0;
}
int main()
{ fin>>n>>m;fin.get();
   int i,j;
   for(i=1;i<=n;i++)
     { for(j=1;j<=m;j++)
        { fin>>c;
           if(c=='.') a[i][j]=0;
           else if(c=='*') a[i][j]=-1;
           else if(c=='D') {a[i][j]=-2;ul++;cx[ul]=i;cy[ul]=j;}
           else if(c=='I') {a[i][j]=-3;xs=i;ys=j;}
           else if(c=='O') {a[i][j]=-4;xf=i;yf=j;}
        }
    fin.get();
     }
   LEE();
  /* for(i=1;i<=n;i++)
     {for(j=1;j<=m;j++)
      fout<<a[i][j]<<" ";
      fout<<"\n";}*/
   s=1;d=n+m;
   while(s<=d)
    { mij=s+(d-s)/2;
      if(le(mij)==1) s=mij+1;
      else d=mij-1;
    }
 if((s-1)!=0) fout<<s-1;
 else fout<<-1;
    return 0;
}