Cod sursa(job #255450)

Utilizator katakunaCazacu Alexandru katakuna Data 9 februarie 2009 19:28:11
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>

int d[2][4]={{0,1,0,-1},{1,0,-1,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;
}

int main(){

  FILE *f=fopen("kdrum.in","r");
  FILE *g=fopen("kdrum.out","w");

  fscanf(f,"%d %d %d",&n,&m,&k);
  fscanf(f,"%d %d %d %d",&x1,&y1,&x2,&y2);
  for(i=1; i<=n; i++)
     for(j=1; j<=m; j++)
        fscanf(f,"%d",&a[i][j]);

  for(i=1; i<=k; i++){
     if(k%i == 0){
     div[++nrdiv] = i;
     poz[i] = nrdiv;
     }
  }

  p=1;
  u=1;
  c[0][p] = x1;
  c[1][p] = y1;
  c[2][p] = poz[k / cmmdc(a[x1][y1],k)];
  cst[x1][y1][c[2][p]] = 1;


  while(p<=u){

     for(i=0; i<=3; i++){
        x = c[0][p] + d[0][i];
        y = c[1][p] + d[1][i];

        if(x>0 && y>0 && x<=n && y<=m && a[x][y]){
        q = div[ c[2][p] ] / cmmdc(div[ c[2][p] ], a[x][y]);
        w = cst[ c[0][p] ][ c[1][p] ][ c[2][p] ] + 1 ;
           if(cst[x][y][poz[q]] > w || !cst[x][y][poz[q]]){
               cst[x][y][poz[q]] = w;
               u++;
               c[0][u] = x;
               c[1][u] = y;
               c[2][u] = poz[q];
           }

        }

     }

  p++;
  }

  fprintf(g,"%d",cst[x2][y2][1]);
  fclose(f);
  fclose(g);

  return 0;
}