Cod sursa(job #467515)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 29 iunie 2010 10:51:02
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#define NMAX 55
#define LMAX 12005
#define PMAX 205
#define HMAX 500005
int n,m,k,A[NMAX][NMAX];
int x1,y1,x2,y2,B[LMAX],r,val[PMAX];
int cost[NMAX][NMAX][PMAX];
struct coada
{
	int a,b,c;
};
coada Q[HMAX];
int dlin[]={0,0,-1,1};
int dcol[]={-1,1,0,0};
void read()
{
	scanf("%d%d%d",&n,&m,&k);
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
	int i,j;
	for (i=1; i<=n; i++)
		for (j=1; j<=m; j++)
			scanf("%d",&A[i][j]);

}
void desc()
{
	int i;
	B[1]=++r; B[k]=++r;
	val[1]=1; val[2]=k;
	for (i=2; i*i<=k; i++)
		if (k % i==0)
		{
			B[i]=++r;
			val[r]=i;
			if (i*i!=k)
				B[k/i]=++r,val[r]=k/i;
		}
}
int cmmdc(int a,int b)
{
	int r;
	while(b)
	{
		r=a%b; a=b; b=r;
	}
	return a;
}
inline int ok(int x,int y)
{
	return 1<=x && x<=n && 1<=y && y<=m && A[x][y]>0;
}
void solve()
{
	r=0;
	Q[++r].a=x1; Q[r].b=y1; Q[r].c=B[cmmdc(A[x1][y1],k)];
	cost[Q[r].a][Q[r].b][Q[r].c]=1;
	int i,j,st=0,dr,x,y,z;
	while (1)
	{
		dr=r;
		for (i=st+1; i<=dr; i++)
			for (j=0; j<4; j++)
			{
				x=Q[i].a+dlin[j]; y=Q[i].b+dcol[j]; z=cmmdc(val[Q[i].c]*A[x][y],k); z=B[z];
				if (ok(x,y) && !cost[x][y][z])
				{
					cost[x][y][z]=cost[Q[i].a][Q[i].b][Q[i].c]+1;
					Q[++r].a=x; Q[r].b=y; Q[r].c=z;
				}
			}
		st=dr;
		if (dr==r)
			break ;
	}
}
int main()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	read();
	desc();
	solve();
	printf("%d\n",cost[x2][y2][2]);
	return 0;
}