Cod sursa(job #269198)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 2 martie 2009 17:24:59
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>

const int dx[]={0,0,-1,1},
          dy[]={-1,1,0,0};
int q,w,nrdiv,poz[12800],div[128],n,m,k,x1,x2,y1,y2,i,j,a[64][64],cst[64][64][128],c[3][250000],p,u,x,y;

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

void citire()
{
  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]);
}

void initi()
{
  for (i=1; i<=k; i++)
    {  if (k%i == 0)
        {
          div[++nrdiv] = i;
          poz[i] = nrdiv;
        }
    }
}
void lee()
{
  int li=1,lf=1;
  c[0][li] = x1;
  c[1][li] = y1;
  c[2][li] = poz[k/cmmdc(a[x1][y1],k)];
  cst[x1][y1][c[2][li]] = 1;
  for(;li<=lf;li++)
  {
    for (i=0; i<4; i++)
        {
          x = c[0][li] + dx[i];
          y = c[1][li] + dy[i];
          if(x<1||x>n) continue;
          if(y<1||y>m) continue;
          if(!a[x][y]) continue;
          q = div[ c[2][li] ] / cmmdc(div[ c[2][li] ], a[x][y]);
          w = cst[ c[0][li] ][ c[1][li] ][ c[2][li] ] + 1 ;
          if (cst[x][y][poz[q]] > w || !cst[x][y][poz[q]])
             {
               cst[x][y][poz[q]] = w;
               lf++;
               c[0][lf] = x;
               c[1][lf] = y;
               c[2][lf] = poz[q];
             }

         }
  }
}

int main()
{
  freopen("kdrum.in","r",stdin);
  freopen("kdrum.out","w",stdout);
  citire();
  initi();
  lee();
  printf("%d",cst[x2][y2][1]);
  return 0;
}