Cod sursa(job #419755)

Utilizator funkydvdIancu David Traian funkydvd Data 17 martie 2010 22:26:54
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include<fstream>
#include<deque>
using namespace std;
ifstream f1 ("barbar.in");
ofstream f2 ("barbar.out");
short int r,c,a[1005][1005],best[1005][1005];
int startx,starty,finx,finy;
bool valid[1005][1005];
const int dlin[]={0,0,1,-1}, dcol[]={1,-1,0,0};
deque < pair <short int, short int> > q;
int ver_bf (int k)
{
	int x,y,j;
	if (k!=0) if (a[startx][starty]<k) return 0;
	memset (valid,0, sizeof (valid));
	valid[startx][starty]=1;
	q.push_back (make_pair(startx, starty));
	while (!q.empty())
	{
		x=q.front().first;
		y=q.front().second;
		for (j=0; j<=3; j++)
			if (x+dlin[j]>=0 && y+dcol[j]>=0){
			if (valid[x+dlin[j]][y+dcol[j]]==0  && a[x+dlin[j]][y+dcol[j]]>=k) 
			{
				//f2<<x+dlin[j]<<" "<<y+dcol[j]<<"D"<<endl;
			q.push_back(make_pair(x+dlin[j],y+dcol[j]));
			valid[x+dlin[j]][y+dcol[j]]=1;
			}}
		q.pop_front();
	}
	if (valid[finx][finy]) return 1;
	return 0;
}
int bf_2()
{
	int x,y,j;
	memset (valid,0, sizeof (valid));
	if (a[startx][starty]!=-2 && a[startx][starty]!=-1)	valid[startx][starty]=1; else return 0;
	q.push_back (make_pair(startx, starty));
	while (!q.empty())
	{
		x=q.front().first;
		y=q.front().second;
		for (j=0; j<=3; j++)
			if (x+dlin[j]>=0 && y+dcol[j]>=0){
			if (valid[x+dlin[j]][y+dcol[j]]==0  && a[x+dlin[j]][y+dcol[j]]!=-2 && a[x+dlin[j]][y+dcol[j]]!=-1) 
			{
			q.push_back(make_pair(x+dlin[j],y+dcol[j]));
			valid[x+dlin[j]][y+dcol[j]]=1;
			}}
		q.pop_front();
	if (valid[finx][finy]) return 1;
	return 0;
	}
}
int main()
{
	int i,j,x,y;
	char ch;
	f1>>r>>c;
	for (i=1; i<=r; i++)
	{
		f1.get(ch);
		for (j=1; j<=c; j++) 
		{
			f1.get(ch);
			if (ch=='.') a[i][j]=-1;
			if (ch=='*') a[i][j]=-2;
			if (ch=='I') {startx=i; starty=j; a[i][j]=-1;}
			if (ch=='O') {finx=i; finy=j; a[i][j]=-1;}
			if (ch=='D') q.push_back (make_pair (i,j));
		}
	}
	for (i=0; i<=r+1; i++) a[0][i]=a[r+1][i]=-2;
	for (j=0; j<=c+1; j++) a[j][0]=a[j][c+1]=-2;
	while (!q.empty())
	{
		x=q.front().first;
		y=q.front().second;
		for (j=0; j<=3; j++)
			if (a[x+dlin[j]][y+dcol[j]]==-1 || a[x+dlin[j]][y+dcol[j]]>-1 && a[x][y]+1<a[x+dlin[j]][y+dcol[j]])
				{q.push_back(make_pair (x+dlin[j], y+dcol[j])); a[x+dlin[j]][y+dcol[j]]=a[x][y]+1;}
		q.pop_front();
	}
	int step=1;
	for (step=1; step<=c*r; step<<=1);
	for (i=0; step; step>>=1)
		if (ver_bf(i+step))  i+=step;
	if (i!=0) f2<<i;
		else if (bf_2()==0) f2<<-1; else f2<<0;

	return 0;
}