Cod sursa(job #578312)

Utilizator netedu_andreiFII Andrei Netedu netedu_andrei Data 11 aprilie 2011 10:45:39
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.73 kb
#include<stdio.h>
#include<string.h>

struct date
{
	long i;
	long j;
};

char cc;
long ifi,jfi,is,js,x,n,m,max,i,j,a[2001][2001],c[2001][2001];
date b[50010000];
int main()
{
     freopen("barbar.in","r",stdin);
     freopen("barbar.out","w",stdout);
     scanf("%ld %ld\n",&n,&max);
     for(i=1;i<=n;i++)
	{
          for(j=1;j<=max;j++)
          {
               scanf("%c",&cc);
               if(cc=='*') a[i][j]=-1;
               if(cc=='D')
               {
                    m++;
                    b[m].i=i;
                    b[m].j=j;
               }
			else if(cc=='I') 
			{
				is=i;
				js=j;
			}
			else if(cc=='O')
			{
				ifi=i;
				jfi=j;
			}
		}
		scanf("\n");
	}
	
	x=1;
	for(i=0;i<=n;i++)
	{
		a[i][0]=-1;
		a[i][n+1]=-1;
	}
	for(i=0;i<=max;i++)
	{
		a[0][i]=-1;
		a[max+1][i]=-1;
	}
	
	while(x<=m)
	{
		if(a[b[x].i+1][b[x].j]==0)
		{
			m++;
			b[m].i=b[x].i+1;
			b[m].j=b[x].j;
			a[b[m].i][b[m].j]=1+a[b[x].i][b[x].j];
		}
		
		if(a[b[x].i-1][b[x].j]==0)
		{
			m++;
			b[m].i=b[x].i-1;
			b[m].j=b[x].j;
			a[b[m].i][b[m].j]=1+a[b[x].i][b[x].j];
		}
		
		if(a[b[x].i][b[x].j+1]==0)
		{
			m++;
			b[m].i=b[x].i;
			b[m].j=b[x].j+1;
			a[b[m].i][b[m].j]=1+a[b[x].i][b[x].j];
		}
		
		if(a[b[x].i][b[x].j-1]==0)
		{
			m++;
			b[m].i=b[x].i;
			b[m].j=b[x].j-1;
			a[b[m].i][b[m].j]=1+a[b[x].i][b[x].j];
		}
		x++;
	}
  	memset(b,0,sizeof(b));
	x=1;
	b[x].i=is;
	b[x].j=js;
	m=1;
	
	c[b[x].i][b[x].j]=a[b[x].i][b[x].j];
	while(x<=m)
	{
		if(a[b[x].i+1][b[x].j]!=-1 && c[b[x].i+1][b[x].j]<c[b[x].i][b[x].j])
		{
			m++;
			if(c[b[x].i][b[x].j]<a[b[x].i+1][b[x].j]) 
				c[b[x].i+1][b[x].j]=c[b[x].i][b[x].j];
			else c[b[x].i+1][b[x].j]=a[b[x].i+1][b[x].j];
			b[m].i=b[x].i+1;
			b[m].j=b[x].j;
		}
		
		if(a[b[x].i-1][b[x].j]!=-1 && c[b[x].i-1][b[x].j]<c[b[x].i][b[x].j])
		{
			m++;
			if(c[b[x].i][b[x].j]<a[b[x].i-1][b[x].j]) 
				c[b[x].i-1][b[x].j]=c[b[x].i][b[x].j];
			else c[b[x].i-1][b[x].j]=a[b[x].i-1][b[x].j];
			b[m].i=b[x].i-1;
			b[m].j=b[x].j;
		}
		
		if(a[b[x].i][b[x].j+1]!=-1 && c[b[x].i][b[x].j+1]<c[b[x].i][b[x].j])
		{
			m++;
			if(c[b[x].i][b[x].j]<a[b[x].i][b[x].j+1]) 
				c[b[x].i][b[x].j+1]=c[b[x].i][b[x].j];
			else c[b[x].i][b[x].j+1]=a[b[x].i][b[x].j+1];
			b[m].i=b[x].i;
			b[m].j=b[x].j+1;
		}
		
		if(a[b[x].i][b[x].j-1]!=-1 && c[b[x].i][b[x].j-1]<c[b[x].i][b[x].j])
		{
			m++;
			if(c[b[x].i][b[x].j]<a[b[x].i][b[x].j-1]) 
				c[b[x].i][b[x].j-1]=c[b[x].i][b[x].j];
			else c[b[x].i][b[x].j-1]=a[b[x].i][b[x].j-1];
			b[m].i=b[x].i;
			b[m].j=b[x].j-1;
		}
		x++;
	}
	if(c[ifi][jfi]==0)
	{
		printf("-1\n");
		return 0;
	}
	printf("%ld\n",c[ifi][jfi]);
	return 0;
}