Cod sursa(job #2742623)

Utilizator eugen5092eugen barbulescu eugen5092 Data 21 aprilie 2021 12:29:44
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <bits/stdc++.h>
using namespace std;
ifstream ci("barbar.in");
ofstream cou("barbar.out");
struct coord
{
	int x,y;
};
coord fin,intr;
int n,m,v[1005][1005],dragoni[1005][1005],lee[1005][1005],mxdrg;
short coordx[5]= {-1,0,1,0};
short coordy[5]= {0,1,0,-1};
queue<coord>drg;
queue<coord>q;

void citire()
{
	ci>>n>>m;
	int i,j;
	char a;
	coord w;
	for(i=1; i<=n; i++)
	{
		for(j=1; j<=m; j++)
		{
			ci>>a;
			if(a=='.')
			{
				v[i][j]=0;
			}
			if(a=='I' )
			{
				w.x=i;
				w.y=j;
				intr=w;
				q.push(w);
				//v[i][j]=1;
			}
			if(a=='D' )
			{
				w.x=i;
				w.y=j;
				drg.push(w);
				v[i][j]=1;
			}
			if(a=='*' )
			{
				v[i][j]=1;
			}
			if(a=='O' )
			{
				fin.x=i;
				fin.y=j;
			}


		}
	}

}
bool Ok(int i,int j)
{
	if(i>=1&&j>=1&&i<=n&&j<=m)
	{
		return 1;
	}
	return 0;
}


void Leedragoni()
{
	coord w,w1;
	while(!drg.empty())
	{
		w=drg.front();
		drg.pop();

		for(int i=0; i<=3; i++)
		{
			w1.x=w.x+coordx[i];
			w1.y=w.y+coordy[i];
			if(Ok(w1.x,w1.y))
			{
				if(dragoni[w1.x][w1.y]==0||dragoni[w1.x][w1.y]>dragoni[w.x][w.y]+1 )
				{
					drg.push(w1);
					dragoni[w1.x][w1.y]=dragoni[w.x][w.y]+1;
				}
			}

		}


	}




}

void Lee(int k)
{
	int i,j;
	for(i=1; i<=n; i++)
	{
		for(j=1; j<=m; j++)
		{
			lee[i][j]=0;
		}
	}


	coord w,w1;
	while(!q.empty())
	{
		w=q.front();
		q.pop();
		if(dragoni[w.x][w.y]<k )
		{
			//cout<<dragoni[w.x][w.y]<<" ---------\n";
			return;
		}


		for(int i=0; i<=3; i++)
		{
			w1.x=w.x+coordx[i];
			w1.y=w.y+coordy[i];
			if(Ok(w1.x,w1.y))
			{
				if(dragoni[w1.x][w1.y]>=k )
				{
					if(v[w1.x][w1.y]!=1 )
					{
						if(lee[w1.x][w1.y]==0||lee[w1.x][w1.y]!=1 )
						{
							q.push(w1);
							lee[w1.x][w1.y]=1;
						}
					}

				}
			}

		}


	}


}

void afL()
{
	for(int i=1; i<=n; i++)
	{
		for(int j=1; j<=m; j++)
		{
			cout<<lee[i][j]<<" ";
		}
		cout<<"\n";
	}
	cout<<"\n";
}

void rez()
{
	int st=1,dr=n*m+3;
	int mij;
	int i,j,veri=0,sol=0;

	while(st<=dr)
	{

		mij=(st+dr)/2;
		if(dragoni[intr.x][intr.y]>=mij)
		{
			q.push(intr);
			Lee(mij);
			//cout<<st<<" "<<dr<<" "<<mij<<"\n";
			//afL();
		}
		else
		{
			lee[fin.x][fin.y]=0;
		}

		if(lee[fin.x][fin.y]==0 )
		{
			dr=mij-1;
		}
		else
		{
			st=mij+1;
			sol=mij;
		}
	}


	if(sol==0)
	{
		cou<<"-1 ";
	}
	else
	{
		cou<<sol;
	}

}








int main()
{
	citire();
	Leedragoni();
	rez();
	return 0;
}