Cod sursa(job #530764)

Utilizator ivan_marianIvan Liviu Marian ivan_marian Data 8 februarie 2011 13:50:53
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#include <string.h>

FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");
int viz[1001][1001],q[2][1000001],a[1001][1001],i,j,r,c,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0},u,p,r1,c1,r2,c2;
char cc;
int abs(int x) {
	if(x<0)
		return -x;
	return x;
}
void coada() {
	p=1;
	int l,ccc;
	while(p<=u) {
		for(int i=0;i<=3;i++) {
			l=q[0][p]+dx[i];
			ccc=q[1][p]+dy[i];
			if(a[l][ccc]!=-1)
				if(a[l][ccc]>a[q[0][p]][q[1][p]]+1) {
					a[l][ccc]=a[q[0][p]][q[1][p]]+1;
					if(viz[l][ccc]==0) {
						viz[l][ccc]=1;
						u++;
						q[0][u]=l;
						q[1][u]=ccc;
					}
				}
		}
		viz[q[0][p]][q[1][p]]=0;p++;
	}
}
	
int coada1(int m) {
	int p=1,u=1,l,ccc;
	q[0][1]=r1;
	q[1][1]=c1;
memset(viz,0,sizeof(viz));
viz[r1][c1]=1;
	while(p<=u) {
		for(int i=0;i<=3;i++) {
			l=q[0][p]+dx[i];
			ccc=q[1][p]+dy[i];
			if(a[l][ccc]!=-1&&a[l][ccc]>=m&&viz[l][ccc]==0){
						viz[l][ccc]=1;
						u++;
						q[0][u]=l;
						q[1][u]=ccc;
					if(l==r2&&ccc==c2)
						return 1;
					}
				}
		p++;
		}

	return 0;
}


int main() {
	fscanf(f,"%d%d\n",&r,&c);
	u=0;
	for(i=1;i<=r;i++) {
		for(j=1;j<=c;j++) {
			fscanf(f,"%c",&cc);
			if(cc=='D'){
				a[i][j]=0;
				u++;
				q[0][u]=i;
				q[1][u]=j;
			}
			else
				if(cc!='*')
					a[i][j]=10000001;
				else
					a[i][j]=-1;
			if(cc=='I') {
				r1=i;
				c1=j;
			}
			if(cc=='O') {
				r2=i;
				c2=j;
			}
		}
		fscanf(f,"\n");
	}
	for(i=0;i<=c+1;i++)
		a[0][i]=a[r+1][i]=-1;
	for(i=0;i<=r+1;i++)
		a[i][0]=a[i][c+1]=-1;
	coada();
int cp=0;int tb=-1, cu=(r+c+abs(r-c))/2,m,ok;
while(cp<=cu){
	m=(cp+cu)/2;
	ok=coada1(m);
	if(ok==1){
		tb=m;
		cp=m+1;
	}
	else
		cu=m-1;
}
if(tb==-1){
	fprintf(g,"-1");
	return 0;
}
fprintf(g,"%d",tb);
return 0;
}