Cod sursa(job #441222)

Utilizator mihai995mihai995 mihai995 Data 12 aprilie 2010 20:27:56
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct punct{short int lin,col;};
const short int dl[]={-1,0,1,0};
const short int dc[]={0,1,0,-1};
punct coada[1000000],x,z;
int v[1001][1001],p,u,m,n;
bool q[1001][1001];

void lee()
{
	punct x,y;
	int i,j;
	while (p!=u)
		for (i=0,x=coada[++p];i<4;i++)
		{
			y.lin=x.lin+dl[i];
			y.col=x.col+dc[i];
			if (v[y.lin][y.col]>v[x.lin][x.col]+1)
			{
				coada[++u]=y;
				v[y.lin][y.col]=v[x.lin][x.col]+1;
			}
		}
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			if (v[i][j]==32000)
				v[i][j]=-1;
}

bool good(short int safe)
{
	p=u=0;
	int i,j;
	punct y,t;
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			q[i][j]=false;
	if (v[x.lin][x.col]>=safe)
	{
		q[x.lin][x.col]=true;
		coada[++u]=x;
	}
	while (p<u && !q[z.lin][z.col])
		for (i=0,y=coada[++p];i<4;i++)
		{
			t.lin=y.lin+dl[i];
			t.col=y.col+dc[i];
			if (!q[t.lin][t.col] && v[t.lin][t.col]>=safe && v[t.lin][t.col])
			{
				q[t.lin][t.col]=true;
				coada[++u]=t;
			}
		}
	return q[z.lin][z.col];
}	

void bsearch()
{
	int i,step=1<<10;
	lee();
	for (i=0;step;step>>=1)
		if (v[z.lin][z.col]>=i+step && good(i+step))
			i+=step;
	if (v[z.lin][z.col]==-1 && !good(0))
	{
		out<<"-1\n";
		return;
	}
	out<<i<<"\n";
}

int main()
{
	int i,j;
	char s[1<<10];
	in>>n>>m;
	in.get();
	for (i=0;i<=m+1;i++)
	{
		v[0][i]=-1;
		v[n+1][i]=-1;
	}
	for (i=0;i<=n+1;i++)
	{
		v[i][0]=-1;
		v[i][n+1]=-1;
	}
	for (i=1;i<=n;i++)
	{
		in.getline(s+1,m+1);
		for (j=1;j<=m;j++)
			switch(s[j])
			{
				case '.':v[i][j]=32000;break;
				case '*':v[i][j]=-1;break;
				case 'D':coada[++u].lin=i;coada[u].col=j;v[i][j]=0;break;
				case 'I':x.lin=i;x.col=j;v[i][j]=32000;break;
				default:z.lin=i;z.col=j;v[i][j]=32000;break;
			}
	}	
	bsearch();
	return 0;
}