Cod sursa(job #329673)

Utilizator cotofanaCotofana Cristian cotofana Data 7 iulie 2009 03:19:52
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <string.h>
#define dim 1002

const int dx[]={0, 1, 0, -1}, dy[]={1, 0, -1, 0};
int r, c, a[dim][dim], xi, yi, xf, yf, b[dim][dim], fol[dim][dim];
int x[dim*dim], y[dim*dim], st=1, end=0;
char s[dim];

int min(const int &a, const int &b) {
	return a>b?b:a;
}

void bf() {
	int xx, yy, i;
	while (st<=end) {
		for (i=0; i<4; ++i) {
			xx=x[st]+dx[i];
			yy=y[st]+dy[i];
			if (xx && xx<=r && yy && yy<=c && !b[xx][yy] && a[xx][yy]!=1 && a[xx][yy]!=-1) {
				b[xx][yy]=b[x[st]][y[st]]+1;
				x[++end]=xx, y[end]=yy;
			}
		}
		st++;
	}
}

int bf2(int val) {
	int xx, yy, i;
	
	memset(fol, 0, sizeof(fol));
	memset(x, 0, sizeof(x));
	memset(y, 0, sizeof(y));
	memset(y, 0, sizeof(y));
	st=end=0;
	x[0]=xi, y[0]=yi;
	fol[xi][yi]=1;
	
	while (st<=end) {
		for (i=0; i<4; ++i) {
			xx=x[st]+dx[i];
			yy=y[st]+dy[i];
			if (xx && xx<=r && yy && yy<=c && a[xx][yy]!=1 && a[xx][yy]!=-1 && !fol[xx][yy] && b[xx][yy]>=val) {
				fol[xx][yy]=1;
				x[++end]=xx, y[end]=yy;
				if (xx==xf && yy==yf) return 1;
			}
		}
		st++;
	}
	
	return 0;
}

int main() {
	int i, j, pr, ul, sol, m;
	freopen("barbar.in", "r", stdin);
	freopen("barbar.out", "w", stdout);
	
	scanf("%d %d\n", &r, &c);
	for (i=1; i<=r; ++i) {
		scanf("%s\n", s);
		for (j=1; j<=c; ++j)
			if (s[j-1]=='.') a[i][j]=0;
			else if (s[j-1]=='*') a[i][j]=-1;
			else if (s[j-1]=='D') a[i][j]=1, x[++end]=i, y[end]=j;
			else if (s[j-1]=='I') a[i][j]=0, xi=i, yi=j;
			else a[i][j]=0, xf=i, yf=j;
	}
	
	bf();
	pr=1, ul=min(b[xi][yi], b[xf][yf]);
	while (pr<=ul) {
		m=(st+ul)/2;
		if (bf2(m)) sol=m, pr=m+1;
		else ul=m-1;
	}
	
	printf("%d\n", sol);
	
	return 0;
}