Cod sursa(job #633271)

Utilizator matei_cChristescu Matei matei_c Data 13 noiembrie 2011 14:05:07
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
const int MAX_N = 51 ;
const int MAX_K = 12001 ;
const int MAX_NDIV = 220 ;
const int dx[4]={1,0,-1,0} ;
const int dy[4]={0,-1,0,1} ;

struct celula
{
	int x,y,d;
};

int n,m,k,x1,x2,y1,y2;
int a[MAX_N][MAX_N];
int div[MAX_NDIV],v[MAX_K];
int dist[MAX_N][MAX_N][MAX_NDIV];
int ndiv;

int len;
celula coada[MAX_N*MAX_N*MAX_NDIV];

void divizori()
{
	for(int i=1;i<=k;++i)
		if(k%i==0)
		{	
			div[++ndiv]=i;
			v[i]=ndiv;
		}	
		
}

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

int main()
{
	freopen("kdrum.in","r",stdin);
	freopen("kdrum.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			scanf("%d",&a[i][j]);
	divizori();
	dist[x1][y1][v[1]]=1;
	coada[1].x = x1;
	coada[1].y = y1;
	coada[1].d = 1;
	len = 1;
	for(int i=1;i<=len;++i)
	{
		int x=coada[i].x;
		int y=coada[i].y;
		int d=coada[i].d;
		for(int j=0;j<4;++j)
		{	
			int vx = x+dx[j];
			int vy = y+dy[j];
			if( (vx>=1 && vx<=n) && (vy>=1 && vy<=m) && a[vx][vy]!=0 )
			{
				int vd=v[cmmmdc(a[vx][vy]*div[d],k)];
				if(dist[vx][vy][vd]==0)
				{
					len++;
					coada[len].x=vx;
					coada[len].y=vy;
					coada[len].d=vd;
					dist[vx][vy][vd]=dist[x][y][d]+1;
				}	
			}		
		}	
	}	
	printf("%d\n",dist[x2][y2][v[k]]);
	return 0;
}