Cod sursa(job #974560)

Utilizator Kira96Denis Mita Kira96 Data 17 iulie 2013 15:25:44
Problema Barbar Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<fstream>
#include<queue>
#define N 1010
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,1,-1};
queue<int> qx,qy;
int dr,st,e[N][N],i,j,n,m,mij,sol,xi,yi,xf,yf,yc,xc,x,y;
bool viz[N][N],c[N][N];
char ch;
void prec()
{
	while(!qx.empty())
	{
		x=qx.front();y=qy.front();
		qx.pop();qy.pop();
		for(i=1;i<=4;++i)
		{
			xc=x+dx[i];
			yc=y+dy[i];
			if(xc<1||yc<1||xc>n||yc>m||e[xc][yc]||c[xc][yc])
				continue;
			e[xc][yc]=e[x][y]+1;
			qx.push(xc); qy.push(yc);
		}
	}
}
int bfs(int mid)
{
	for(i=1;i<=n;++i)
		for(j=1;j<=m;++j)
			viz[i][j]=0;
	qx.push(xi);
	qy.push(yi);
	while(!qx.empty())
	{
		x=qx.front();y=qy.front();
		viz[x][y]=1;
		qx.pop();qy.pop();
		for(i=1;i<=4;++i)
		{
			xc=x+dx[i];
			yc=y+dy[i];
			if(xc<1||yc<1||xc>n||yc>m||c[xc][yc]||e[xc][yc]<mid||viz[xc][yc])
				continue;
			qx.push(xc);
			qy.push(yc);
			if(xc==xf&&yc==yf)
			{
				while(!qx.empty())
					qx.pop(),qy.pop();
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	f>>n>>m;
	for(i=1;i<=n;++i)
		for(j=1;j<=m;++j)
		{
			f>>ch;
			if(ch=='D')
			{
				qx.push(i);
				qy.push(j);
				c[i][j]=1;
			}
			else
			if(ch=='I')
				xi=i,yi=j;
			else
			if(ch=='O')
				xf=i,yf=j;
			else
			if(ch=='*')
				c[i][j]=1;
		}
	prec();
	st=1;
	dr=e[xi][yi];
	while(st<=dr)
	{
		mij=(st+dr)>>1;
		if(bfs(mij))
		{
			sol=mij;
			st=mij+1;
		}
		else
			dr=mij-1;
	}
	if(!sol)
		g<<"-1";
	else
		g<<sol;
	return 0;
}