Cod sursa(job #471571)

Utilizator mottyMatei-Dan Epure motty Data 19 iulie 2010 15:04:21
Problema Kdrum Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>

const int N=52;
const int M=72;
const int B=12002;
const int X[]={0,1,0,-1};
const int Y[]={1,0,-1,0};

struct xyz{
	int x,y,div;
};

int n,m,k,nd;
int id[B],cd[M];//transformarea din divizor in cod
int v[N][N][M];//matricea de costuri
int c[N][N];//matricea citita
xyz q[N*N*M];//coada
int d,u;
xyz st,fn;

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

int GetDiv(int k){
	int nrdiv=0;
	for( int i=1; i<=k; ++i)
		if(k%i==0){
			nrdiv++;
			id[i]=nrdiv;
			cd[nrdiv]=i;
		}
	return nrdiv;
}

void Read(){
	scanf("%d%d%d",&n,&m,&k);
	
	scanf("%d%d%d%d",&st.x,&st.y,&fn.x,&fn.y);
	
	nd=GetDiv(k);
	
	for( int i=1; i<=n; ++i)
		for( int j=1; j<=n; ++j)
			scanf("%d",&c[i][j]);
	
	int xsx=k/cmmdc(k,c[st.x][st.y]);
	
	st.div=id[xsx];
}

void Verify(xyz x){
	int ax,ay,nw;
	xyz aux;
	for( int i=0; i<4; ++i){
		ax=X[i]+x.x;
		ay=Y[i]+x.y;
		if(c[ax][ay]){
			nw=cmmdc(cd[x.div],c[ax][ay]);
			nw=cd[x.div]/nw;
			if(!v[ax][ay][id[nw]]){
				v[ax][ay][id[nw]]=v[x.x][x.y][x.div]+1;
				aux.x=ax;
				aux.y=ay;
				aux.div=id[nw];
				q[++u]=aux;
			}
		}
	}
}

void Parc(){
	d=u=1;
	q[1]=st;
	while(d<=u && v[fn.x][fn.y][1]==0 ){
		Verify(q[d]);
		++d;
	}
	printf("%d\n",v[fn.x][fn.y][1]+1);
}

int main()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	
	Read();
	Parc();
	
	return 0;
}