Cod sursa(job #749122)

Utilizator danalex97Dan H Alexandru danalex97 Data 15 mai 2012 20:21:51
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <cstdio>
#include <fstream>
using namespace std;

#define Dm 55

int Mat[Dm][Dm];
int Cmmdc[Dm][Dm][Dm];
int Cmmdc2[Dm][Dm];
int Div[Dm];
int Piv[Dm*Dm*Dm];

int N,M,K,Nbr;

#define x first
#define y second
pair<int,int> Beg,End;

int Min=Dm*Dm+1;

const int Dx[]={0,1,0,-1,0};
const int Dy[]={0,0,1,0,-1};

inline int Euclid(int A,int B)
{ int a=A; for (int b=B,c; b>0 ; c=a%b , a=b , b=c ); return a;}

#define Final ( X==End.x && Y==End.y )
#define In ( (X+Dx[i])>0 && (Y+Dy[i])>0 && (X+Dx[i])<N+1 && (Y+Dy[i])<M+1 )
#define Null ( Mat[X+Dx[i]][Y+Dy[i]]==0 )
#define True ( Val == K )

void Fill(int X,int Y,int Pas,int Val)
{
	if ( Final && True )
	{
		if ( Pas < Min ) 
			Min=Pas;
		return;
	}
	
	if ( Pas > Min )
		return;
	
	for (int i=1;i<=4;++i)
		if ( In && (!Null) )
		{
			int v=Mat[X][Y];
			Mat[X][Y]=0;
			X+=Dx[i],Y+=Dy[i];
			
			int V=Val;
			
			int xy=Cmmdc[Piv[K]][X][Y];
			Val=(Val*xy)/Cmmdc2[Piv[xy]][Piv[Val]];
			Fill(X,Y,Pas+1,Val);
			
			Val=V;
			
			Mat[X][Y]=v;
			X-=Dx[i],Y-=Dy[i];
		}
}

int main()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	
	scanf("%d%d%d",&N,&M,&K);
	scanf("%d%d",&Beg.x,&Beg.y);
	scanf("%d%d",&End.x,&End.y);
	
	for (int i=1;i<=N;++i)
		for (int j=1;j<=M;++j)
			scanf("%d",&Mat[i][j]);
	
	for (int D=1;D<=K;++D)
		Div[++Nbr]=( K%D ) ? Div[--Nbr] : D;

	for (int i=1;i<=Nbr;++i)
		Piv[Div[i]]=i;
	
	for (int D=1;D<=Nbr;++D)
		for (int i=1;i<=N;++i)
			for (int j=1;j<=M;++j)
				Cmmdc[D][i][j]=Euclid(Mat[i][j],Div[D]);
	for (int D=1;D<=Nbr;++D)
		for (int D2=1;D2<=Nbr;++D2)
			Cmmdc2[D][D2]=Euclid(Div[D],Div[D2]);
	
	Fill(Beg.x,Beg.y,1,Cmmdc[Piv[Mat[Beg.x][Beg.y]]][Beg.x][Beg.y]);
	
	printf("%d\n",Min);
}