Cod sursa(job #2321506)

Utilizator DavvDrgDavid Dragostin DavvDrg Data 16 ianuarie 2019 10:20:18
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>
using namespace std;
#define NMAX 1001
long lin[]={1,-1,0,0};
long col[]={0,0,-1,1};
long qqq,rez,c,aa,bb,in,b,qq,sf,l,x[NMAX][NMAX],y[NMAX][NMAX],z[NMAX][NMAX],i,j,k,n,m,a,xi,yi,xf,yf;
struct kkt
{
long X,Y,K;
};
kkt q[NMAX*NMAX];
int main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    cin>>n>>m>>c;
	m--;
	for (i=1;i<=n;i++)
	{
		for (j=0;j<=m;j++)
		{
			cin>>c;
			if (c=='D')
			{
				q[++sf].X=i;
				q[sf].Y=j+1;
				q[sf].K=0;
				y[i][j+1]=2;
			} else
			if (c=='*')
			   y[i][j+1]=1;
			else
			{
				if (c=='I') {xi=i; yi=j+1;}
				if (c=='O') {xf=i;yf=j+1;}
			}
		}
		cout<<endl;
	}
	in=1;
	m++;
	while (in<=sf)
	{
		for (i=0;i<=3;i++)
		{
			a=q[in].X+lin[i];
			b=q[in].Y+col[i];
			if (a>=1&&a<=n&&b>=1&&b<=m&&z[a][b]==0&&y[a][b]!=1)
			{

				sf++;
				q[sf].X=a;
				q[sf].Y=b;
				q[sf].K=q[in].K+1;
				z[a][b]=q[sf].K;
			}
		}
		in++;
	}
	k=-1;
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
		{
			if (z[i][j]>k)
				k=z[i][j];
			y[i][j]=0;
		}
	aa=0;
	bb=k;
	rez=-1;
	qqq=1;
	while (qqq)
	{
		if (aa==bb) qqq=0;
		j=(aa+bb)/2;
		in=1;
		sf=1;
		q[1].X=xi;
		q[1].Y=yi;
		y[xi][yi]=1;
		qq=0;
		while (in<=sf)
		{
			for (i=0;i<=3;i++)
			{
				a=q[in].X+lin[i];
				b=q[in].Y+col[i];
				if (a>=1&&a<=n&&b>=1&&b<=m&&y[a][b]!=1&&z[a][b]>=j)
				{
					if (a==xf&&b==yf) {qq=1; in=sf+100;}
					sf++;
					q[sf].X=a;
					q[sf].Y=b;
					y[a][b]=1;
				}
			}
			in++;
		}
		if (qq) {aa=j+1;rez=j; }
		else
		{bb=j-1;}
		for (i=1;i<=n;i++)
			for (l=1;l<=m;l++)
			y[i][l]=0;
	}
	printf("%ld\n",rez);
	return 0;
}