Cod sursa(job #328023)

Utilizator ConsstantinTabacu Raul Consstantin Data 30 iunie 2009 19:16:03
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>
#include<fstream>
using namespace std;

int a[1001][1001],b[1001][1001],l,c,li,ci,lf,cf;

struct coada{int l,c;}v[1000001];

int dl[]={0,0,1,0,-1},k,dc[]={0,1,0,-1,0};
void citire(){
ifstream f("barbar.in");

int i,j;
char x;
f>>l>>c;

for(i=1;i<=l;i++)
	
	for(j=1;j<=c;j++)
		{f>>x;
		if(x=='D')
			{k++;v[k].l=i;v[k].c=j;b[i][j]=1;}
		else
			if(x=='*')
				a[i][j]=-1;
		else
			if(x=='I'){
				li=	i;ci=j;
				}
		else
			if(x=='O'){
			lf=i;cf=j;
			}
		}
}

void fill(){
int i,p,L,C,q;

p=1;q=k;

while(p<=q){
for(i=1;i<=4;i++)
	{L=dl[i]+v[p].l;
	C=dc[i]+v[p].c;
	
	
	if((a[L][C]!=-1)&&(!b[L][C])&&(L>0)&&(C>0)&&(L<=l)&&(C<=c))
	 
		{a[L][C]=a[v[p].l][v[p].c]+1;

		q++;v[q].l=L;v[q].c=C;b[L][C]=1;
		
		}
	}
p++;
}}

int test(int val,int nr){
int i,p,q,L,C;

p=1;q=1;
if(a[v[1].l][v[1].c]<val) return 0;
while(p<=q){

	for(i=1;i<=4;i++)
		{L=v[p].l+dl[i];
		C=v[p].c+dc[i];
		if((a[L][C]>=val)&&(a[L][C]!=-1)&&(b[L][C]!=nr)&&(L>0)&&(C>0)&&(L<=l)&&(C<=c))
			{q++;b[L][C]=nr;
			v[q].l=L;v[q].c=C;
			if((L==lf)&&(C=cf))return 1;
			}
		}
p++;
}

return 0;
}

void caut(){
int nr=2;
int p,u,m,sol=0;
p=0;u=a[li][ci];v[1].l=li;v[1].c=ci;
while(p<=u){
	m = (p+u)>>1;
	if(test(m,nr)){p=m+1;sol=m;}
	else
	u=m-1;
	nr++;}

freopen("barbar.out","w",stdout);
if(sol)
printf("%d",sol);
else
	printf("%d",-1);

}


int main(){
citire();
fill();
caut();

return 0;
}