Cod sursa(job #66318)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 17 iunie 2007 19:22:43
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <cstdio>
#define fin  "barbar.in"
#define fout "barbar.out"
#define Nmax 1001

int N,M,map[Nmax][Nmax],viz[Nmax][Nmax];
int v[Nmax*Nmax][2];
int sx,sy,fx,fy;
int vf,pr,val,lim;

void ins(int x,int y) {
	if (x<1 || x>N || y<1 || y>M) return;
	if (map[x][y]) return ;
	map[x][y]=val+1;
	++vf;
	v[vf][0]=x; v[vf][1]=y;
}
void go() {
int x,y,i,curr;
	curr=vf;
	for (i=pr;i<=curr;++i) {
		x=v[i][0]; y=v[i][1];
		if (map[x][y]==-1)
			val=0;
		else
			val=map[x][y];
		ins(x-1,y); ins(x+1,y);
		ins(x,y-1); ins(x,y+1);
	}
	pr=curr+1;
	if (pr<=vf) go();
}

void ins1(int x,int y) {
	if (x<1 || x>N || y<1 || y>M) return;
	if (map[x][y]<lim || viz[x][y]) return ;
	viz[x][y]=1;
	++vf;
	v[vf][0]=x; v[vf][1]=y;
}
void go1() {
int x,y,i,curr;
	curr=vf;
	for (i=pr;i<=curr;++i) {
		x=v[i][0]; y=v[i][1];
		if (map[x][y]>=lim) {
			viz[x][y]=1;
			ins1(x-1,y); ins1(x+1,y);
			ins1(x,y-1); ins1(x,y+1);
		}
	}
	pr=curr+1;
	if (pr<=vf) go1();
}

int main() {
int i,j;
char c;
	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%d%d",&N,&M);

	for (i=1;i<=N;++i) {
		fgetc(stdin);
		for (j=1;j<=M;++j) {
			scanf("%c",&c);
			if (c=='*') 
				map[i][j]=-1;
			if (c=='D') {
				map[i][j]=-1;
				vf++;
				v[vf][0]=i;
				v[vf][1]=j;
			}
			if (c=='I') {
				sx=i; sy=j;
			}
			if (c=='O') {
				fx=i; fy=j;
			}
		}
	}

	pr=1;
	go();	//BF pt dist minime
/*	
	for (i=1;i<=N;++i) {
	for (j=1;j<=M;++j)
		fprintf(stderr,"%d ",map[i][j]);
	fprintf(stderr,"\n");
	}
*/
	int m,lo,hi;

	lo=1; hi=N*M+1;

	while (lo <= hi) {
		m=(lo+hi)/2;
		pr=1; vf=1;
		v[vf][0]=sx; v[vf][1]=sy;
		for (i=1;i<=N;++i)
		for (j=1;j<=M;++j)
			viz[i][j]=0;
		lim=m;
		go1();	//go ionel
/*			
		fprintf(stderr,"%d %d %d\n",lo,hi,viz[fx][fy]);
		for (i=1;i<=N;++i) {
		for (j=1;j<=M;++j)
			fprintf(stderr,"%d ",viz[i][j]);
		fprintf(stderr,"\n");
		}
*/
		if (!viz[fx][fy]) 
			hi=m-1;
		else
			lo=m+1;
	}

	if (hi==0)
		printf("-1");
	else
		printf("%d\n",hi);

	return 0;
}