Cod sursa(job #483159)

Utilizator cosmyoPaunel Cosmin cosmyo Data 7 septembrie 2010 02:50:17
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<fstream.h>
#include<vector>
#include<queue>
#define NMAX 1000005
using namespace std;
long dl[4]={-1,0,1,0};
long dc[4]={0,1,0,-1};
vector<long> a[NMAX],d(NMAX,NMAX);
char C[1002][1002];
char drg[NMAX];
queue<long> q;
vector<bool> v;
long r,c,n,ns,nf,cd[NMAX],ls,cs,lf,cf;
void cit()
{ifstream fin("barbar.in");
  fin>>r>>c;
  long i,j;

   for(i=1;i<=r;++i)
	   for(j=1;j<=c;++j)
		   fin>>C[i][j];
  fin.close();
}
void firstbfs()
{long i,k;
 v.reserve(n+2);
 for(i=1;i<=n;++i)
	 v[i]=false;
 for(i=1;i<=n;++i)
	 if(drg[i]==1)
		 q.push(i),v[i]=true,d[i]=0;
 while(!q.empty())
	 {k=q.front();
       for(i=0;i<a[k].size();++i)
        if(v[a[k][i]]==false&&d[a[k][i]]>d[k]+1)
		{v[a[k][i]]=true;
         d[a[k][i]]=d[k]+1;		
		 q.push(a[k][i]);
		}
	  q.pop();
	 }
}

long bfs(long p)
{long i,k,j,sw=0,l,cl;
 cd[0]=0;
 if(d[ns]>=p)
 cd[++cd[0]]=ns;
 for(i=1;i<=n;++i)
	 v[i]=false;
 v[ns]=true;
  for(j=1;j<=cd[0];++j)
    {k=cd[j];
		 for(i=0;i<a[k].size();++i)
			 if(!v[a[k][i]]&&d[a[k][i]]>=p)
			 {cd[++cd[0]]=a[k][i];
			  v[a[k][i]]=true;
				  if(a[k][i]==nf)
				  {return 1;
				  }
			 }
	}
 return 0;	
}	
long cauta(long p,long u)
{long m=(p+u)/2;
  if(p<=u)
  {
   if(bfs(m))
	 return cauta(m+1,u);
    else
	 return cauta(p,m-1);
  }
  else
		  if(p>u)
		  return p-1;
}

void afis()
{ofstream fout("barbar.out");
  long k=cauta(1,n);

  if(k==0&&bfs(0)==0)
	  fout<<-1<<'\n';
  else
	  fout<<k<<'\n';
fout.close();
}
int main()
{cit();
 long i,j,k,ni,nj;
  for(i=1;i<=r;++i)
	  for(j=1;j<=c;++j)
       if(C[i][j]=='I')
	    {C[i][j]='.';ls=i;cs=j;}
		else
	  if(C[i][j]=='O')
	  {C[i][j]='.';lf=i;cf=j;}
  for(i=1;i<=r;++i)
	  for(j=1;j<=c;++j)
	  {++n;
	   drg[n]=2;
		   if(C[i][j]=='D')
			   drg[n]=1;
		   if(C[i][j]=='.')
			   drg[n]=0;
	    for(k=0;k<=3;++k)
			{ni=i+dl[k];
			 nj=j+dc[k];
			  if(ni>=1&&ni<=r&&nj>=1&&nj<=c&&C[i][j]!='*'&&C[ni][nj]!='*')
				  a[n].push_back((ni-1)*c+nj);
			 }
	  }
 ns=(ls-1)*c+cs;
 nf=(lf-1)*c+cf; 
 firstbfs(); 	  
 afis();
 return 0;
}