Cod sursa(job #204737)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 26 august 2008 18:41:51
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include<stdio.h>
#include<fstream>
using namespace std;



 int N,M,xi,yi,xf,yf;
 int dragoni[1002][1002],barbar[1002][1002];
 char a[1002][1002];

 int dx[]={1,0,-1,0},
     dy[]={0,1,0,-1};

 struct co{int x,y;};
 typedef co coada[1001*1000];

 ifstream fin("barbar.in");
 ofstream fout("barbar.out");

 void init(){
     for(int i=1;i<=N;i++)
         for(int j=1;j<=M;j++)
             barbar[i][j]=0;
 }


     int incc,sfc;
     coada c;
void Lee(int sol){
         init();
         incc=sfc=1;
         c[1].x=xi;c[1].y=yi;
         while(incc<=sfc){
             int xx=c[incc].x,yy=c[incc].y;
             ++incc;
             for(int k=0;k<=3;k++){
                 int xxx=xx+dx[k],yyy=yy+dy[k];
                 if(xxx&&yyy&&xxx<=N&&yyy<=M&&dragoni[xxx][yyy]>=sol&&barbar[xxx][yyy]==0&&a[xxx][yyy]!=1){
                     c[++sfc].x=xxx;
                     c[sfc].y=yyy;
                     barbar[xxx][yyy]=barbar[xx][yy]+1;
                 }
             }

        }
}

int main(){


     fin>>N>>M;
     char x;
     for(int i=1;i<=N;i++)
     for(int j=1;j<=M;j++){
         fin>>x;
         if(x=='.') a[i][j]=0;
         if(x=='*') a[i][j]=1;
         if(x=='D') a[i][j]=2;
         if(x=='I') {xi=i;yi=j;}
         if(x=='O') {xf=i;yf=j;}
         dragoni[i][j]=-1;
     }




 /*    for(int i=1;i<=N;i++){
         for(int j=1;j<=M;j++)
             printf("%d ",dragoni[i][j]);
         printf("\n");
     }
*/

     int ok=1,sol;
     int li=0,lf=1000*1000;
     while(lf-li>1){
         int mij = (li+lf)/2;
         Lee(mij);

         if(barbar[xf][yf])
            li=mij;
        else
            lf=mij;
     }

     Lee(lf);
     if(barbar[xf][yf])
        fout<<lf<<"\n";
     else{
        Lee(li);
        if(barbar[xf][yf])
            fout<<li<<"\n";
        else
            fout<<"-1\n";
     }


     fin.close();
     fout.close();

  }