Cod sursa(job #407505)

Utilizator unknownliviuMaria Liviu Valentin unknownliviu Data 2 martie 2010 13:23:31
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<cstdio>
using namespace std;
const int N=1020;
char a[N];
int b[N][N];
int n,u,m;
struct pol{int x,y;};
pol c[N*N*3],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]=='O')
				sr[0].x=i,sr[0].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();
	if(!h)
		return 1;
	int p=1,u=1,i;
	pol r;
	if(b[sr[1].x][sr[1].y]<h)
		return 0;
	c[1]=sr[1];
	viz[sr[1].x][sr[1].y]=1;
	while(p<=u)
	{
		r=c[p];
		for(i=1;i<=4;i++)
		{
			if(b[r.x+dl[i]][r.y+dc[i]]>=h && viz[r.x+dl[i]][r.y+dc[i]]==0)//dist e cel putin h & nodu nu e vizitat
			{
				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
	if(viz[sr[0].x][sr[0].y]==1)
		return 1;
	return 0;
}

int main()
{
	freopen("barbar.out","w",stdout);
	//brodare();
	read();
	lee();
	int rasp=0,pas=1<<10; // a<<b;  a * 2^b
	while(pas>0)
	{
		if (bfs(rasp+pas))
			rasp += pas;
		pas /= 2; //pas >>= 1;
	}
	if (rasp == 0)
		printf("-1");
	else
	printf("%d\n", rasp);
	return 0;
}