Cod sursa(job #260517)

Utilizator alexeiIacob Radu alexei Data 17 februarie 2009 10:09:05
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>

#define NMAX 64
#define MAXD 110
#define KMAX 12020
#define HUGE 275000
#define inf 0x3f3f3f3f

int A[NMAX][NMAX];
int M[NMAX][NMAX][MAXD];

int P[MAXD],NR[KMAX];

typedef struct
{
	int x,y,d;
}q;
q L[HUGE];

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

int N,M1,K;
int X1,Y1,X2,Y2;

int cmmdc(int a,int b)
{
	int r=a%b;

	while( r )
	{
		a=b;
		b=r;
		r=a%b;
	}

	return b;
}

void reading()
{
	scanf("%d%d%d\n",&N,&M1,&K);
	scanf("%d%d%d%d\n",&X1,&Y1,&X2,&Y2);

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

void init()
{
	int i,j,k;
	for(i=1; i<=N; ++i)
		for(j=1; j<=M1; ++j)
			for(k=1; k<=MAXD; ++k)
				M[i][j][k]=inf;
	
	int incr=0;
	for(i=1; i<=K; ++i)
	{
		if( K%i==0 )
		{
			++incr;
			NR[i]=incr;
			P[incr]=i;
		}
	}
}

void BF()
{
	int i;
	int inc,sf;
	inc=sf=1;
	
	L[ 1 ].x = X1;
	L[ 1 ].y = Y1;
	L[ 1 ].d = NR[ K / cmmdc( K, A[X1][Y1] ) ];

	M[ X1 ][ Y1 ][ L[1].d ]=1;

	int a1,a2,a3,s;
	int b1,b2,b3;
	while( inc<=sf )
	{
		a1=L[inc].x;
		a2=L[inc].y;
		a3=L[inc].d;
		s=M[a1][a2][a3]+1;
		++inc;

		//printf("%d %d %d %d\n",a1,a2,a3,s-1);

		for(i=0; i<4; ++i)
		{
			b1=a1+dx[i];
			b2=a2+dy[i];
			
			if( A[b1][b2] )
			{
				b3= NR[ P[a3]/cmmdc( P[a3], A[b1][b2] )];
				
				if( M[b1][b2][b3] > s )
				{
					M[b1][b2][b3]=s;
					
					L[++sf].x=b1;
					L[sf].y=b2;
					L[sf].d=b3;
				}
			}
		}
	}
	printf("%d\n",M[X2][Y2][1]);
}

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

	reading();
	init();
	BF();
	return 0;
}