Cod sursa(job #293472)

Utilizator drag0shSandulescu Dragos drag0sh Data 1 aprilie 2009 20:55:33
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#define nume "kdrum"

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

int n,m,k,a[51][51],x1,y1,x2,y2;
int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
int poz[12005],div[200],v[51][51][200];

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

struct ok{int x,y,z;}h[1000001];

int main(){
  int i,j,d,p,q,xx,yy,x,y,z,t;
  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,d=0;i<=n;i++){
    if(k%i==0){
      div[++d]=i;
      poz[i]=d;
    }
  }
  
  h[1].x=x1;
  h[1].y=y1;
  h[1].z=poz[cmmdc(k,a[x1][y1])];
  v[x1][y1][h[1].z]=1;
  printf("%d",x2);
  for(p=1,q=1;p<=q;p++){
    x=h[p].x,y=h[p].y,z=h[p].z;
    for(i=0;i<4;i++){
      xx=x+dx[i],yy=y+dy[i];
      if(xx>0&&xx<=n&&yy>0&&yy<=m){
	if(a[xx][yy]){
	  t=cmmdc(k,a[xx][yy]*div[z]);
	  t=poz[t];
	  if(v[xx][yy][t]>v[x][y][z]+1||!v[xx][yy][t]){
	    v[xx][yy][t]=v[x][y][z]+1;
	    q++;
	    h[q].x=xx;
	    h[q].y=yy;
	    h[q].z=t;
	  }
	}
    }
  }
}
fprintf(g,"%d",v[x2][y2][d]);

fclose(f);
fclose(g);
return 0;
}