Cod sursa(job #266057)

Utilizator DraStiKDragos Oprica DraStiK Data 24 februarie 2009 21:16:23
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>
#define DIM 65
#define KMAX 12005
#define DIV 155
struct coada {int x,y,d;} c[DIM*DIM*DIV];
int dx[4]={1,0,-1, 0};
int dy[4]={0,1, 0,-1};
int sol[DIM][DIM][DIV],a[DIM][DIM],d[DIV],uz[KMAX];
int n,m,k,x1,y1,x2,y2,nrt;
void read ()
{
    int i,j;
    scanf ("%d%d%d%d%d%d%d",&n,&m,&k,&x1,&y1,&x2,&y2);
    for (i=1; i<=n; ++i)
		for (j=1; j<=m; ++j)
            scanf ("%d",&a[i][j]);
    for (i=1; i<=k; ++i)
        if (k%i==0)
        {
            d[++nrt]=i;
            uz[i]=nrt;
        }
}
int euclid (int a,int b)
{
    int r;
    do
    {
        r=a%b;
        a=b;
        b=r;
    }
    while (r);
    return a;
}
void solve ()
{
    coada t;
    int in=1,sf=1,q,h;
    q=euclid (k,a[x1][y1]);
    c[in].x=x1;
    c[in].y=y1;
    c[in].d=uz[k/q];
    sol[x1][y1][uz[k/q]]=1;
    while (in<=sf)
    {
        t=c[in++];
        for (q=0; q<4; ++q)
            if (a[t.x+dx[q]][t.y+dy[q]])
            {
                h=d[t.d]/euclid (d[t.d],a[t.x+dx[q]][t.y+dy[q]]);
                if (sol[t.x+dx[q]][t.y+dy[q]][uz[h]]>sol[t.x][t.y][t.d]+1 || !sol[t.x+dx[q]][t.y+dy[q]][uz[h]])  
                {  
                    sol[t.x+dx[q]][t.y+dy[q]][uz[h]]=sol[t.x][t.y][t.d]+1;   
                    c[++sf].x=t.x+dx[q];  
                    c[sf].y=t.y+dy[q];
                    c[sf].d=uz[h];  
               }
            }
    }
	printf ("%d",sol[x2][y2][uz[1]]);
}
int main ()
{
    freopen ("kdrum.in","r",stdin);
    freopen ("kdrum.out","w",stdout);
    read ();
    solve ();
    return 0;
}