Cod sursa(job #419732)

Utilizator funkydvdIancu David Traian funkydvd Data 17 martie 2010 22:03:31
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<fstream>
#include<deque>
using namespace std;
ifstream f1 ("barbar.in");
ofstream f2 ("barbar.out");
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 <int, 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 (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 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);
	if (r*c<100000 && ver_bf(0)==0) f2<<"-1";
		else
	{for (i=0; step; step>>=1)
		if (ver_bf(i+step))  i+=step;
	f2<<i;}
	return 0;
}