Cod sursa(job #191298)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 25 mai 2008 21:27:41
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#define N 1005
int b[N][N],m,n,p,x2,y2,x1,y1;
char c[N][N];
struct ab{
	int x,y;
};
ab v[N*N];
const int lin[]={0,0,1,-1};
const int col[]={1,-1,0,0};
void lee(int x,int y){
	for(int t=0;t<4;t++)
		if(b[x+lin[t]][y+col[t]]==-2){
			b[x+lin[t]][y+col[t]]=b[x][y]+1;
			v[++v[0].x].x=x+lin[t];
			v[v[0].x].y=y+col[t];
		}
}
void citire(){
	int i,j;
	char x;
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%d%d\n",&m,&n);
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++){
			scanf("%c\n",&x);
			if(x=='D') {
				v[++v[0].x].x=i;
				v[v[0].x].y=j;
			}
			else if(x=='*') b[i][j]=-1;
			else b[i][j]=-2;
			if(x=='O') {
				x2=i;
				y2=j;
			}
			if(x=='I'){
				x1=i;
				y1=j;
			}
		}
}
void lee2(int x,int y){
	for(int t=0;t<4;t++)
		if(c[x+lin[t]][y+col[t]]==-1 && b[x+lin[t]][y+col[t]]>=p){
			v[++v[0].x].x=x+lin[t];
			v[v[0].x].y=y+col[t];
			c[x+lin[t]][y+col[t]]=1;
		}
}
void curat(){
	int i,j;
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			c[i][j]=-1;
}
int solve(int lung){
	int i;
	v[0].x=1;p=lung;
	v[1].x=x1;v[1].y=y1;
	curat();
	if(b[x1][y1]<p) return 0;
	for(i=1;i<=v[0].x;i++){
		if(c[x2][y2]==1) return 1;
		lee2(v[i].x,v[i].y);
	}
	if(c[x2][y2]==1) return 1;
	return 0;
}
int main(){
	int i,j,st=0,dr=N*N*10,mij,x;
	citire();
	for(i=1;i<=v[0].x;i++)
		lee(v[i].x,v[i].y);
	while(st<=dr){
		mij=(st+dr)/2;
		if(solve(mij)) st=mij+1;
		else dr=mij-1;
	}
	printf("%d",st-1);
	return 0;
}