Cod sursa(job #530796)

Utilizator ivan_marianIvan Liviu Marian ivan_marian Data 8 februarie 2011 14:44:25
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#include <string.h>
#define mm 1000001
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&&a[l][ccc]==mm){
					a[l][ccc]=a[q[0][p]][q[1][p]]+1;
						u++;
						q[0][u]=l;
						q[1][u]=ccc;
					}
				}
		
		p++;
	}
}
	
int coada1(int m) {
	int p=1,u=1,l,ccc;
	q[0][1]=r1;
	q[1][1]=c1;
	if(a[r1][c1]<m)
		 return 0;
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]=mm;
				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,m,ok;
while(cp<=cu){
	m=(cp+cu)/2;
	ok=coada1(m);
	if(ok==1){
		tb=m;
		cp=m+1;
	}
	else
		cu=m-1;
}

fprintf(g,"%d",tb);
return 0;
}