Cod sursa(job #405980)

Utilizator unknownliviuMaria Liviu Valentin unknownliviu Data 1 martie 2010 00:29:47
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<cstdio>
using namespace std;
const int N=1000;
char a[N];
int b[N][N];
int n,u,m;
struct pol{int x,y;};
pol c[N*N],sr[3];
int k=0;
int viz[N][N],dl []={0, 0, 0, 1, -1}, dc []={0, -1, 1, 0, 0};


void brodare();

void read()
{
	freopen("barbar.in","r",stdin);
	int i;
	scanf("%d%d\n",&n,&m);
	brodare ();
	for(i=1;i<=n;i++)
	{
		scanf("%s\n",a+1);
		for(int j=1;j<=m;j++)
		{ 	
			if(a[j]=='D')
			{
				b[i][j]=0;
				k++;
				c[k].x=i,c[k].y=j;
				viz[i][j]=1;
				
			}
			if(a[j]=='*')
			{
				viz[i][j]=1;
				b[i][j]=-2;
			}
			if(a[j]=='I')
				sr[1].x=i,sr[1].y=j;
			if(a[j]=='0')
				sr[0].x=i,sr[1].y=j;
		}
	}
}

void brodare()
{
	for(int i=0;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			b[i][j]=-1;
		viz [0] [i]=viz [n+1] [i]=1;
		viz [i] [0]=viz [i] [m+1]=1;
	}
}
void lee()
{
	int p=1,u=k,i;
	pol r;//tip definit de mn, la fel ca si tipu in care sunt stocati politistii
	while(p<=u)
	{
		r=c[p];
		for(i=1;i<=4;i++)
		{	//vecin=a[r.x+dl[i]][r.y+dl[i]];
			if(viz[r.x+dl[i]][r.y+dc[i]]==0)//daca vecinu e nevizitat
			{
				u++;
				c[u].x=r.x+dl[i];
				c[u].y=r.y+dc[i];
				b[r.x+dl[i]][r.y+dc[i]]=1+b[r.x][r.y];
				viz[r.x+dl[i]][r.y+dc[i]]=1;
			}
		}
		++p;
	}
}
void reset()
{
	for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			viz[i][j]=0;
}
int bfs(int h)
{
	reset();
	int p=1,u=1,i;
	pol r;
	c[1]=sr[1];
	while(p<=u)
	{
		r=c[p];
		for(i=1;i<=4;i++)
		{
			if(b[r.x+dl[i]][r.y+dc[i]]>=h)//daca distanta e min h
				if(!viz[r.x+dl[i]][r.y+dc[i]])
				{
					u++;
					c[u].x=r.x+dl[i];
					c[u].y=r.y+dc[i];
					//ici ce fac? zic eu nimic, 
					viz[r.x+dl[i]][r.y+dc[i]]=1;
				}
		}
		++p;
	}
	return viz[sr[0].x][sr[0].y];//daca nodul final ajunge sa fie vizitat sau nu
}
int bsearch(int in,int sf)
{
	int mij,ok=-1;
	mij=(in+sf)/2;
	while(in<sf)
	if(bfs(mij)==1)
	{
		in=mij+1;
		ok=mij;
	}
	else
		sf=mij-1;
	return ok;
}
int main()
{
	freopen("barbar.out","w",stdout);
	//brodare();
	read();
	lee();
	printf("%d",bsearch(0,n*m));
	return 0;
}