Cod sursa(job #487430)

Utilizator ChallengeMurtaza Alexandru Challenge Data 25 septembrie 2010 11:01:03
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
#include <queue>

//#define DEBUG

using namespace std;

const char InFile[]="barbar.in";
const char OutFile[]="barbar.out";
const int MaxN=1005;
const int MAX=1<<30;
const int i_disp[]={0,0,1,-1};
const int j_disp[]={1,-1,0,0};

ifstream fin(InFile);
ofstream fout(OutFile);

struct s_point
{
	s_point(int i2=0,int j2=0):i(i2),j(j2){}
	int i,j;
};

int vmin[MaxN][MaxN],R,C,sol,p,u,m;
int a[MaxN][MaxN];
char ch;
queue<s_point> q;
s_point in,out;

void lee()
{
	s_point p;
	int c;
	while(!q.empty())
	{
		p=q.front();
		q.pop();
		c=vmin[p.i][p.j]+1;
		for(register int i=0;i<4;++i)
		{
			if(vmin[p.i+i_disp[i]][p.j+j_disp[i]]>c)
			{
				vmin[p.i+i_disp[i]][p.j+j_disp[i]]=c;
				q.push(s_point(p.i+i_disp[i],p.j+j_disp[i]));
			}
		}
	}
}

bool is_good(int min)
{
	for(register int i=1;i<=R;++i)
	{
		for(register int j=1;j<=C;++j)
		{
			a[i][j]=0;
		}
	}
	for(register int i=0;i<=R+1;++i)
	{
		a[i][0]=1;
		a[i][C+1]=1;
	}
	for(register int j=0;j<=C+1;++j)
	{
		a[0][j]=1;
		a[R+1][j]=1;
	}

	a[in.i][in.j]=1;
	q.push(in);
	s_point p;
	while(!q.empty())
	{
		p=q.front();
		q.pop();
		for(register int i=0;i<4;++i)
		{
			if(a[p.i+i_disp[i]][p.j+j_disp[i]]==0 && min<=vmin[p.i+i_disp[i]][p.j+j_disp[i]])
			{
				a[p.i+i_disp[i]][p.j+j_disp[i]]=1;
				q.push(s_point(p.i+i_disp[i],p.j+j_disp[i]));
			}
		}
	}
	return a[out.i][out.j]==1;
}

int main()
{
	fin>>R>>C;
	for(register int i=1;i<=R;++i)
	{
		for(register int j=1;j<=C;++j)
		{
			fin>>ch;
			if(ch=='.')
			{
				vmin[i][j]=MAX;
			}
			else if(ch=='D')
			{
				vmin[i][j]=0;
				q.push(s_point(i,j));
			}
			else if(ch=='I')
			{
				vmin[i][j]=MAX;
				in.i=i;
				in.j=j;
			}
			else if(ch=='O')
			{
				vmin[i][j]=MAX;
				out.i=i;
				out.j=j;
			}
			else if(ch=='*')
			{
				vmin[i][j]=-2;
			}
		}
	}
	fin.close();

	lee();
	for(register int i=1;i<=R;++i)
	{
		for(register int j=1;j<=C;++j)
		{
			if(vmin[i][j]==MAX)
			{
				vmin[i][j]=-1;
			}
		}
	}

#ifdef DEBUG
	for(register int i=1;i<=R;++i)
	{
		for(register int j=1;j<=C;++j)
		{
			fout<<vmin[i][j]<<" ";
		}
		fout<<"\n";
	}
	fout<<"\n";
#endif

	p=0;
	u=vmin[in.i][in.j];
	while(p<=u)
	{
		m=p+(u-p)/2;
		if(is_good(m))
		{
			p=m+1;
			sol=m;
		}
		else
		{
			u=m-1;
		}
	}

	fout<<sol;
	fout.close();
	return 0;
}