Cod sursa(job #263983)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 21 februarie 2009 09:38:57
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<iostream>
#include<stdio.h>
FILE *f=fopen("kdrum.in","r"),*g=fopen("kdrum.out","w");
long x[]={0,0,1,-1},y[]={1,-1,0,0},x_start,y_start,x_finish,y_finish,X,Y;
long a[53][53],k,n,m,i,j,pozin,pozsf,d;
long di[130],sol[53][53][130],poz[12100];
struct {int x,y,v;} coada[53*53*130];
inline int cmmdc(long a,long b)
{
	if(!b) return a;
	return cmmdc(b,a%b);
}
int main()
{
	fscanf(f,"%ld%ld%ld%ld%ld%ld%ld",&n,&m,&k,&x_start,&y_start,&x_finish,&y_finish);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			fscanf(f,"%ld",&a[i][j]);
	for(i=1;i<=k;i++)
		if(!(k%i))
		{
			di[++di[0]]=i;
			poz[i]=di[0];
		}
	pozin=pozsf=1;
	coada[1].x=x_start;coada[1].y=y_start;coada[1].v=cmmdc(a[x_start][y_start],k);
	sol[x_start][y_start][poz[cmmdc(a[x_start][y_start],k)]]=1;
	while(pozin<=pozsf)
	{
		for(i=0;i<4;i++)
		{
			X=coada[pozin].x+x[i];
			Y=coada[pozin].y+y[i];
			d=cmmdc(1LL*coada[pozin].v*a[X][Y],k);
			if(a[X][Y]&&!sol[X][Y][poz[d]])
			{
				pozsf++;
				coada[pozsf].x=X;
				coada[pozsf].y=Y;
				coada[pozsf].v=d;
				sol[X][Y][poz[d]]=sol[coada[pozin].x][coada[pozin].y][poz[coada[pozin].v]]+1;
			}
		}
		pozin++;
	}
	fprintf(g,"%ld\n",sol[x_finish][y_finish][di[0]]);
	return 0;
}