Cod sursa(job #415609)

Utilizator andreea1coolBobu Andreea andreea1cool Data 11 martie 2010 16:34:25
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<stdio.h>
struct cd{
	int i,j,cost;
};

int di[]={0,0,1,-1,0};
int dj[]={0,1,0,0,-1};
cd q[1000001],a;
int m[1001][1001],f[1001][1001];
int r,c,i,j,x1,x2,y1,y2,iv,jv,p,poz;
int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	int ok=0,k=1,in=1,sf=2;
	char ch;
	
	scanf("%d%d\n",&r,&c);
	for(i=1;i<=r;i++){
		for(j=1;j<=c;j++){
			scanf("%c",&ch);
			if(ch=='.'){
				m[i][j]=99999;
			}
			if(ch=='D'){
				m[i][j]=0;
			    q[k].i=i;
			    q[k].j=j;
			    q[k].cost=0;
			    k++;
			}
			if(ch=='I'){
				x1=i;
				y1=j;
				m[i][j]=99999;
			}
			if(ch=='O'){
				x2=i;
				y2=j;
				m[i][j]=99999;
			}
			if(ch=='*'){
				m[i][j]=-1;
			}
		}
		scanf("\n");
	}
	sf=k;
	
	
	while(in<sf)
	{
		a=q[in];
		in++;
		for(i=1;i<=4;i++)
		{
			iv=a.i+di[i];
			jv=a.j+dj[i];
			if((1<=iv)&&(iv<=r)&&(1<=jv)&&(jv<=c)&&(m[iv][jv]!=-1)&&(a.cost+1<m[iv][jv]))
			{
				m[iv][jv]=a.cost+1;
				q[sf].i=iv;
				q[sf].j=jv;
				q[sf].cost=a.cost+1;
			    sf++;
			    
			}
		}
	}
	for(p=1;p*2<=m[x1][y1];p*=2);
	ok=0;
	k=0;
	for(poz=0;p;p/=2)
	{
		for(i=1;i<=r;i++){
			for(j=1;j<=c;j++){
				f[i][j]=0;
			}
		}
		in=1;
		sf=2;
		q[1].i=x1;
		q[1].j=y1;
		q[1].cost=m[x1][y1];
		if(poz+p<=m[x1][y1]){
			
		    while(in<sf)
			{
				a=q[in];
				
				if(a.i==x2&&a.j==y2){
					ok=1;
					poz+=p;
					k=poz;
					break;
				}
				
				
				in++;
				for(i=1;i<=4;i++)
				{
					iv=a.i+di[i];
					jv=a.j+dj[i];
					if((1<=iv)&&(iv<=r)&&(1<=jv)&&(jv<=c)&&(m[iv][jv]!=-1)&&(poz+p<=m[iv][jv])&&f[iv][jv]==0)
					{
						q[sf].i=iv;
						q[sf].j=jv;
						q[sf].cost=m[iv][jv];
			    		sf++;
						f[iv][jv]=1;
					}
				}
			}
		}
	}
	if(ok==1){
		printf("%d",k);
	}
	else{
		printf("-1");
	}
	return 0;
}