Cod sursa(job #873425)

Utilizator DEYDEY2Tudorica Andrei DEYDEY2 Data 7 februarie 2013 10:56:35
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#define NMAX 55
#define LMAX 12005
#define PMAX 205
#define HMAX 500005
int n,m,k,A[NMAX][NMAX];
int x1,y1,x2,y2,B[LMAX],r,val[PMAX];
int cost[NMAX][NMAX][PMAX];
typedef struct coada{int a,b,c;};
coada Q[HMAX];
int dlin[]={0,0,-1,1};
int dcol[]={-1,1,0,0};
int cmmdc(int a,int b)
{
    int r;
    while(b)
    {
        r=a%b; a=b; b=r;
    }
    return a;
}
inline int ok(int x,int y)
{
    return 1<=x && x<=n && 1<=y && y<=m && A[x][y]>0;
}
void solve()
{
    r=0;
    Q[++r].a=x1; Q[r].b=y1; Q[r].c=B[cmmdc(A[x1][y1],k)];
    cost[Q[r].a][Q[r].b][Q[r].c]=1;
    int i,j,st=0,dr,x,y,z;
    while (1)
    {
        dr=r;
        for (i=st+1; i<=dr; i++)
            for (j=0; j<4; j++)
            {
                x=Q[i].a+dlin[j]; y=Q[i].b+dcol[j]; z=cmmdc(val[Q[i].c]*A[x][y],k); z=B[z];
                if (ok(x,y) && !cost[x][y][z])
                {
                    cost[x][y][z]=cost[Q[i].a][Q[i].b][Q[i].c]+1;
                    Q[++r].a=x; Q[r].b=y; Q[r].c=z;
                }
            }
        st=dr;
        if (dr==r)
            break ;
    }
}
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);
    int i,j;
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
            scanf("%d",&A[i][j]);
    B[1]=++r; B[k]=++r;
    val[1]=1; val[2]=k;
    for (i=2; i*i<=k; i++)
        if (k % i==0)
        {
            B[i]=++r;
            val[r]=i;
            if (i*i!=k)
                B[k/i]=++r,val[r]=k/i;
        }
    solve();
    printf("%d\n",cost[x2][y2][2]);
    return 0;
}