Cod sursa(job #696657)

Utilizator Theorytheo .c Theory Data 28 februarie 2012 19:26:22
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include<fstream>
#include<string.h>
#define MAX 1003
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char c[MAX][MAX];
int v[MAX][MAX],i,j,k,n,c1[1720000][2],xi,yi,xf,yf,nrb,m;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool a[MAX][MAX];
void lee();
void cit();
void afis();
int cb();
int verifica(int);
void reset()
{
	int i,j;
	for(i=0;i<=n;i++)
		for(j=0;j<=m;j++)
			a[i][j]=0;
}
int verifica(int x)
{
	int p=1,u=1,in,jn,i,j,k;
	c[1][0]=xi;
	c[1][1]=yi;
	a[xi][yi]=true;
	while(p<=u)
	{
		i=c[p][0];
		j=c[p][1];
		for(k=0;k<4;k++)
		{
			in=i+dx[k];
			jn=j+dy[k];
			if(v[in][jn]>=x && in>0 && jn>0 && in<=n&& jn<=m&&a[in][jn]==0)
			{
				a[in][jn]=true;
				u++;
				c[u][0]=in;
				c[u][1]=jn;
				if(in==xf && jn==yf)
				{
					reset();
					return 1;
				}
			}
		}
		p++;
	}
	reset();
	return 0;
}
int cb()
{
	int p=0,u=5000;
	int m,a,b,c;
	
	while(p<=u)
	{
		m=(p+u)/2;
		if(verifica(m+1))
		{
			p=m+1;
			continue ;
		}
		if(!verifica(m-1))
		{
			u=m;
			continue ;
		}
		if(!verifica(m)&&verifica(m-1))
			return m-1;
		if(!verifica(m+1)&&verifica(m))
			return m;
	
		
	}
	
	return u;

}
void cit()
{
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{
		fin.get();
		fin.get(c[i]+1,1009,'\n');
		//fout<<c[i]+1<<'\n'; 
	}
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		{
			if(c[i][j]=='I')
			{
				xi=i;
				yi=j;
			}
			if(c[i][j]=='O')
			{
				xf=i;yf=j;
			}
			if(c[i][j]=='D')
			{
				c1[++nrb][0]=i;
				c1[nrb][1]=j;
				//fout<<i<<" "<<j<<'\n'; 
			}
		}
	
		afis();
		lee();
		
		if(v[xf][yf]!=-1)
		fout<<cb();
		else
			fout<<-1;
		//fout<<verifica(2);
	
}
void lee()
{
	int u=1,p=1,i,j,in,jn,k;
	u=nrb;
	while(p<=u)
	{
		i=c1[p][0];
		j=c1[p][1];
		for(k=0;k<4;k++)
		{
			in=i+dx[k];
			jn=j+dy[k];
			if(c[in][jn]!='*'&&in>0&&jn>0 && in<=n&& jn<=m &&v[in][jn]==-1)
			{
				u++;
				c1[u][0]=in;
				c1[u][1]=jn;
				
				v[in][jn]=v[i][j]+1;
				if(v[i][j]==-1)
					v[in][jn]++;
			}
		}
		p++;
	}
	
}
void afis()
{
	int i,j;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			v[i][j]=-1;
			//fout<<v[i][j]<<" ";
		}
		//fout<<'\n'; 
	}
}
int main()
{
	cit();
	fin.close();
	return 0;
	
}