Cod sursa(job #457148)

Utilizator bixcabc abc bixc Data 18 mai 2010 09:55:09
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <stdio.h>
#define DIM 1100
#define INF 2*DIM

int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};

int v[DIM][DIM];
char a[DIM][DIM];
int s[DIM][DIM];
int b[DIM][DIM];
int cd[3][DIM*DIM*2];

int r,c,ok,x1,y1,x2,y2,k,p,u,m,ic,jc,iv,jv,x;
int incerc(int x){
	int i,j,p,u;
	ok=0;
	for (i=1;i<=r;i++)
		for (j=1;j<=c;j++)
			v[i][j]=0;
	if (b[x1][y1]<x)
		return 0;
	p=1;u=1;
	cd[1][p]=x1;cd[2][p]=y1;
	v[x1][y1]=1;
	while ((p<=u)&&(!ok)) {
		for (k=0;k<=3;k++) {
			iv=cd[1][p]+dx[k];
			jv=cd[2][p]+dy[k];
			if ((iv>=1)&&(iv<=r)&&(jv>=1)&&(jv<=c)&&(v[iv][jv]==0)&&(b[iv][jv]>=x)) {
				u++;
				cd[1][u]=iv;
				cd[2][u]=jv;
				v[iv][jv]=1;
				if ((iv==x2)&&(jv==y2)) {
					ok=1;
					break;
				}
			}
		}
		p++;
	}
	return ok;
}

int main(){
	int i,j;	
	FILE *f = fopen("barbar.in","r");
	fscanf(f,"%d %d",&r,&c);
	for (i=1;i<=r;i++) {
		fscanf(f,"\n");
		for (j=1;j<=c;j++) {
			fscanf(f,"%c",&a[i][j]);
	
			if (a[i][j]!='*')
				b[i][j]=INF;
			else
				b[i][j]=-1;
			if (a[i][j]=='I') {
				x1=i;y1=j;
			} else if (a[i][j]=='O'){
				x2=i;y2=j;
			}
		}
	}
	fclose(f);

	p=1;
	u=0;
	for (i=1;i<=r;i++)
		for (j=1;j<=c;j++)
			if (a[i][j]=='D') {
				u++;
				cd[1][u]=i;
				cd[2][u]=j;
				b[i][j]=0;
				s[i][j]=u;
			}

	while (p<=u) {
		ic=cd[1][p];
		jc=cd[2][p];
		for (i=0;i<=3;i++) {
			iv=ic+dx[i];
			jv=jc+dy[i];
			if ((a[iv][jv]!='*')&&(iv>=1)&&(iv<=r)&&(jv>=1)&&(jv<=c)&&(b[iv][jv]>b[ic][jc]+1)) {
				if (s[iv][jv]==0) {
					u++;
					cd[1][u]=iv;
					cd[2][u]=jv;
					s[iv][jv]=u;
				}
				b[iv][jv]=b[ic][jc]+1;
			}
		}
		s[cd[1][p]][cd[2][p]]=0;
		p++;
	}
	FILE *g = fopen("barbar.out","w");
	x=0;
	if (!incerc(0)){
		fprintf(g,"-1");
	} else {
		int max=r+c-2;
		p=0; u=max;
		while (p<=u) {
			m = (p+u)/2;
			x=m;
			if (incerc(m))
				p=m+1;
			else
				u=m-1;
		}
		fprintf(g,"%d",u);
	}
	fclose(g);
	return 0;
}