Cod sursa(job #254508)

Utilizator alexeiIacob Radu alexei Data 7 februarie 2009 12:35:28
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.11 kb
#include<stdio.h>
#include<memory.h>
#define NMAX 10

int A[NMAX][NMAX];
int D[NMAX][NMAX];
int C1[NMAX*NMAX+2];
int C2[NMAX*NMAX+2];

int N,M,K;
int x1,x2,y1,y2;

const int dx[]={0,0,-1,1};
const int dy[]={-1,1,0,0};

void bf_1()
{
	int inc=1,sf=0;
	C1[ ++sf ]=x1;
	C2[ sf ]=y1;
	D[ x1 ][ y1 ]=0;
	int a1,a2,a3,a4,i;
	int ANS=N*M+1;

	while( inc<=sf )
	{
		a1=C1[inc];
		a2=C2[inc++];

		if( a1==x2 && a2==y2 ) continue;

		for( i=0; i<4; ++i )
		{
			a3=a1+dx[i];
			a4=a2+dy[i];
			
			if( a3>N || a4>M || a3<1 || a4<1 ) continue;
			if( !A[a3][a4] ) continue;
			
			if( D[a3][a4]==-1 || D[a3][a4]>D[a1][a2]+1 )
			{
				D[a3][a4]=D[a1][a2]+1;
				C1[ ++sf ]=a3;
				C2[ sf ]=a4;
			}
		}
	}

	printf("%d\n",D[ x2 ][ y2 ]);
}

int main()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);

	scanf("%d%d%d\n",&N,&M,&K);

	scanf("%d%d%d%d\n",&x1,&y1,&x2,&y2);

	int i,j;
	for(i=1; i<=N; ++i)
		for(j=1; j<=M; ++j)
			scanf("%d",&A[i][j]);

	memset( D, 0xff, sizeof( D ));

	if( K==1 )//bf penal
		bf_1();
	else
		bf_1();//:)) deh
	return 0;
}