Cod sursa(job #868797)

Utilizator DEYDEY2Tudorica Andrei DEYDEY2 Data 31 ianuarie 2013 17:21:42
Problema Kdrum Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<stdio.h>
#define NMAX 64
#define MAXD 110
#define KMAX 12020
#define HUGE 275000
#define inf 0x3f3f3f3f
 
int A[NMAX][NMAX];
int M[NMAX][NMAX][MAXD];
int P[MAXD],NR[KMAX];
 
typedef struct coada{int x,y,d;};
coada L[HUGE];
const int dx[]={0,0,-1,1};
const int dy[]={-1,1,0,0};
int N,m1,K,x1,y1,x2,y2; 
int cmmdc(int a,int b)
{
    int r=a%b;
    while(r){a=b;b=r;r=a%b;}
    return b;
}
void BF()
{
    int i;
    int inc,sf;
    inc=sf=1;
    L[ 1 ].x = x1;
    L[ 1 ].y = y1;
    L[ 1 ].d = NR[ K / cmmdc( K, A[x1][y1] ) ];
    M[ x1 ][ y1 ][ L[1].d ]=1;
    int a1,a2,a3,s;
    int b1,b2,b3;
    while( inc<=sf )
    {
        a1=L[inc].x;
        a2=L[inc].y;
        a3=L[inc].d;
        s=M[a1][a2][a3]+1;
        inc++;
        for(i=0; i<4; ++i)
        {
            b1=a1+dx[i];
            b2=a2+dy[i];
            if(A[b1][b2])
            {
                b3= NR[ P[a3]/cmmdc( P[a3], A[b1][b2] )];
                if( M[b1][b2][b3] > s )
                {
                    M[b1][b2][b3]=s;
                    L[++sf].x=b1;
                    L[sf].y=b2;
                    L[sf].d=b3;
                }
            }
        }
    }
    printf("%d\n",M[x2][y2][1]);
}
 
int main()
{
    freopen("kdrum.in","r",stdin);
    freopen("kdrum.out","w",stdout);
	scanf("%d%d%d\n",&N,&m1,&K);
    scanf("%d%d%d%d\n",&x1,&y1,&x2,&y2);
    int i,j;
    for(i=1; i<=N; ++i)
        for(j=1; j<=m1; ++j)
            scanf("%d",&A[i][j]);
			int k;
    for(i=1; i<=N; ++i)
        for(j=1; j<=m1; ++j)
            for(k=1; k<=MAXD; ++k)
                M[i][j][k]=inf;
    int incr=0;
    for(i=1; i<=K; ++i)
    {
        if( K%i==0 )
        {
            ++incr;
            NR[i]=incr;
            P[incr]=i;
        }
    }
    BF();
    return 0;
}