Cod sursa(job #782088)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 25 august 2012 21:15:40
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include<fstream>
#include<queue>
#include<algorithm>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int m,n,i,j,psi,x,y,v;
int a[1005][1005];
int b[1005][1005];
int x_source,y_source,x_destination,y_destination,sol;
struct point{int xd; int yd;};
queue<point> Q;
point p,q;
char c;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};

int algoritmul_lui_Lee(int vmin)
{p.xd=x_source;  p.yd=y_source; 
Q.push(p);  
while(!Q.empty())
 {p=Q.front();  
 x=p.xd;  y=p.yd;  
 Q.pop();
 for(psi=0; psi<4; psi++)
    if(b[x+dx[psi]][y+dy[psi]]>=0 && b[x+dx[psi]][y+dy[psi]]!=vmin && a[x+dx[psi]][y+dy[psi]]>=vmin)
     {b[x+dx[psi]][y+dy[psi]]=vmin;
     q.xd=x+dx[psi];  q.yd=y+dy[psi]; 
     Q.push(q);
     if(q.xd==x_destination && q.yd==y_destination)
       {while(!Q.empty())  Q.pop();
        return 1;}
     }
 }
return 0;
}

void cautare_binara(int left, int right)
{if(left==right)
   {if(algoritmul_lui_Lee(left))
        sol=left;
    else   
        sol=left-1;   
    return;}
int mid=(left+right)/2;
if(algoritmul_lui_Lee(mid)==0)
   cautare_binara(left,mid);
else
   cautare_binara(mid+1,right);
}

int main()
{
f>>m>>n;
for(i=1; i<=m; i++)
  a[i][n+1]=a[i][0]=b[i][n+1]=b[i][0]=-1;
for(j=1; j<=n; j++)
  a[m+1][j]=a[0][j]=b[m+1][j]=b[0][j]=-1;  
for(i=1; i<=m; i++)
 for(j=1; j<=n; j++)
   {f>>c;
    if(c=='I')
      {x_source=i;
      y_source=j;}
    if(c=='O')
      {x_destination=i;
      y_destination=j;} 
    if(c=='*') 
      a[i][j]=b[i][j]=-1;
    if(c=='D')
      {a[i][j]=0;
       b[i][j]=-2;
       p.xd=i;  p.yd=j;
       Q.push(p);}
    } 
int nr=100;  
if(b[x_source][y_source]==-2 || b[x_destination][y_destination]==-2)
  {g<<"-1";
  return 0;}  

while(!Q.empty())
 {p=Q.front();  
     x=p.xd;  y=p.yd;  v=a[x][y];
     Q.pop();
     for(psi=0; psi<4; psi++)
       if(a[x+dx[psi]][y+dy[psi]]==0 || a[x+dx[psi]][y+dy[psi]]>v+1)
         {a[x+dx[psi]][y+dy[psi]]=v+1;
          q.xd=x+dx[psi];  q.yd=y+dy[psi];
          Q.push(q);}       
    }   
    
cautare_binara(1,a[x_source][y_source]);   

if(b[x_destination][y_destination]==0)
  {g<<"-1";
  return 0;}  

g<<sol;       
    
f.close();
g.close();
return 0;}