Cod sursa(job #398649)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 19 februarie 2010 09:19:53
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<fstream>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");


char c;
int a[1002][1002],d[1002][1002],n,m,i,j,xx1,xx2,yy1,yy2,k=0,aa[]={-1,1,0,0},bb[]={0,0,-1,1},cx,cy;
struct punct
{
	int x,y;
};
punct p[251000];

void add(int c1, int c2)
{
	k++;
	p[k].x=c1;
	p[k].y=c2;
}

void bordare()
{
	for(i=1;i<=n;i++)
		{a[i][0]=d[i][0]=-1;a[i][m+1]=d[i][m+1]=-1;}
	for(i=1;i<=m;i++)
		{a[0][i]=d[0][i]=-1;a[n+1][i]=d[n+1][i]=-1;}
}
int main()
{
	f>>n>>m;
	for(i=1;i<=n;i++)
	{
		f.get(c);
		for(j=1;j<=n;j++)
		{
			f.get(c);
			switch(c)
			{
				case 'I': xx1=i;yy1=j;a[i][j]=1;break;
				case 'D': d[i][j]=1;add(i,j);break;
				case 'O': xx2=i;yy2=j;break;
				case '*': d[i][j]=a[i][j]=-1;break;
			}
		}
	}
	bordare();
	for(i=1;p[i].x||p[i].y;i++)
	{
		for(int ii=0;ii<4;ii++)
		{
			cx=p[i].x+aa[ii];
			cy=p[i].y+bb[ii];
			if(!d[cx][cy])
			{
				d[cx][cy]=d[p[i].x][p[i].y]+1;
				add(cx,cy);
			}
		}
	}
	k=0;
	add(xx1,yy1);
	int min=d[xx1][yy1];
	bool ok1=true;
	for(i=1;ok1;i++)
		if(p[i].x||p[i].y)
			for(int ii=0;ii<4;ii++)
			{
				cx=p[i].x+aa[ii];
				cy=p[i].y+bb[ii];
				if(cx==xx2&&cy==yy2)
					ok1=false;
				if(!a[cx][cy]&&d[cx][cy]>=min)
					{add(cx,cy);a[cx][cy]=1;d[cx][cy]=0;}
			}
		else
		{
			i=0;min--;if(min==-1) {ok1=false;g<<-1;}
		}
	g<<min-2<<endl;
	f.close();
	g.close();
	return 0;
}