Cod sursa(job #587298)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 4 mai 2011 16:39:10
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<stdio.h>
#define N 1001
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};

struct punct {
	short x,y;
};
punct q[N*N];

int n,m,x1,y1,u,p=1;
char a[N];
short x[N][N],x2,y2;
int yy[N][N],z[N][N];

void aa() {
	for(int ii=1;ii<=n;++ii)
			for(int j=1;j<=m;++j)
				z[ii][j]=0;
}

void bfs1() {
	punct y,xx;
	int i;
	while(u>=p) {
		xx=q[p++];
		for(i=0;i<=3;++i) {
			y.x=xx.x+dx[i];
			y.y=xx.y+dy[i];
			if(x[y.x][y.y]!=-1 && yy[y.x][y.y]==-1) {
				yy[y.x][y.y]=1+yy[xx.x][xx.y];
				q[++u]=y;
			}
		}
	}
}

bool verbfs(int w) {
	u=1; p=1;
	int i;
	punct xx,y;
	while(u>=p) {
		xx=q[p++];
		for(i=0;i<=3;++i) {
			y.x=xx.x+dx[i];
			y.y=xx.y+dy[i];
			if(y.x>0 && y.x<=n && y.y>0 && y.y<=m && x[y.x][y.y]!=-1 && z[y.x][y.y]==0 && yy[y.x][y.y]>=w) {
				q[++u]=y;
				z[y.x][y.y]=1+z[xx.x][xx.y];
			}
		}
	}
	if(z[x2][y2]!=0)
		return 1;
	return 0;
}

int main() {
	int i,j,pas=1<<14;
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i) {
		scanf("%s",&a);
		for(j=0;j<m;++j) {
			yy[i][j+1]=-1;
			if(a[j]=='.')
				x[i][j+1]=0;
			if(a[j]=='*') {
				x[i][j+1]=-1;
			}
			if(a[j]=='D') {
				q[++u].x=i; q[u].y=j+1;
				yy[i][j+1]=0;
				x[i][j+1]=1;
			}
			if(a[j]=='I') {
				x1=i; y1=j+1;
				x[i][j+1]=1;
			}
			if(a[j]=='O') {
				x2=i; y2=j+1;
			}
		}
	}
	bfs1();
	q[1].x=x1; q[1].y=y1;
	if(!verbfs(0)) {
		printf("-1");
		return 0;
	}
	for(i=0;pas!=0;pas>>=1) {
		aa();
		if(i+pas<n*m && verbfs(i+pas))
			i+=pas;
	}
	if(yy[x2][y2]<i)
		i=yy[x2][y2];
	if(yy[x1][y1]<i)
		i=yy[x1][y1];
	printf("%d",i);
	return 0;
}