Cod sursa(job #66341)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 17 iunie 2007 20:12:59
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 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,ret,lim;

void ins(int x,int y) {
	if (x<1 || x>N || y<1 || y>M) return;
	if (map[x][y]!=0) 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 tmp[2*Nmax];
	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

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

	for (i=1;i<=N;++i) {
		scanf("%s",tmp+1);
		for (j=1;j<=M;++j) {
			if (tmp[j]=='*') 
				map[i][j]=-1;
			if (tmp[j]=='D') {
				map[i][j]=-1;
				vf++;
				v[vf][0]=i;
				v[vf][1]=j;
			}
			if (tmp[j]=='I') {
				sx=i; sy=j;
			}
			if (tmp[j]=='O') {
				fx=i; fy=j;
			}
		}
	}
/*
	pr=1;
	go();	//BF pt dist minime

	int m,lo,hi;

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

	ret=-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
			
		if (!viz[fx][fy])
			hi=m-1;
		else 
			lo=m+1;	
	}
*/
//	if (hi==0) hi=-1;
	
	printf("-1\n");

	return 0;
}