Cod sursa(job #274516)

Utilizator 630r63Ilinca George Mihai 630r63 Data 9 martie 2009 20:15:45
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
# include <stdio.h>
# define n 55
# define kk 12001
# define dd 150
int dx[4]={1, 0, -1, 0};
int dy[4]={0, 1, 0, -1};
int N,M,K,x1,y1,x2,y2,x;
int a[n][n],Md[n][n][dd],D[dd],ap[kk];
int l,c,p,u,i,j,d,k;
struct elem{
   int x,y,d;
   }C[n*n*dd],X;
int cmmdc(int a, int b)
{
 int r;
 do{
    r=a%b;
    a=b;b=r;
  }while (r!=0);
  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 (i=1;i<=N;i++)
   for (j=1;j<=M;j++)
     scanf("%d",&a[i][j]);
  for (d=1,k=0;d<=K;d++){
	if (K%d==0){
	    D[++k]=d;
	    ap[d]=k;
	}
    }
  p=u=1;
  C[p].x=x1;
  C[p].y=y1;
  d=cmmdc(a[x1][y1],K);
  C[p].d=ap[K/d];
  Md[x1][y1][ap[K/d]]=1;
  while (p<=u){
   X=C[p];
   for (i=0;i<4;i++){
     l=X.x+dx[i];
     c=X.y+dy[i];
     if (l>=1 && l<=N && c>=1 && c<=M && a[l][c]){
	d=D[X.d]/cmmdc(a[l][c],D[X.d]);
	if (Md[l][c][ap[d]]>Md[X.x][X.y][X.d]+1 || Md[l][c][ap[d]]==0){
	  Md[l][c][ap[d]]=Md[X.x][X.y][X.d]+1;
	  u++;
	  C[u].x=l; C[u].y=c; C[u].d=ap[d];
	}
     }
   }
   p++;
  }
  printf("%d",Md[x2][y2][ap[1]]);
  return 0;
}