Cod sursa(job #2109967)

Utilizator Tomi15Tomescu Mihai Tomi15 Data 20 ianuarie 2018 11:49:57
Problema Kdrum Scor 0
Compilator cpp Status done
Runda evaluare_cex_sv_cls_x_2 Marime 2.1 kb
#include <cstdio>
#include <fstream>
using namespace std;

#define Dm 55
#define Dim 12011
#define Divz 1011

int Mat[Dm][Dm];
int Cmmdc[Divz][Dm][Dm];
int Cmmdc2[Divz][Dm];
int Div[Divz];
int Piv[Dim];

int N,M,K,Nbr;

#define x first
#define y second
pair<int,int> Beg,End;

int Min=Dm*Dm+1;

const int Dx[]={0,1,0,-1,0};
const int Dy[]={0,0,1,0,-1};

inline int Euclid(int A,int B)
{ int a=A; for (int b=B,c; b>0 ; c=a%b , a=b , b=c ); return a;}

#define Final ( X==End.x && Y==End.y )
#define In ( (X+Dx[i])>0 && (Y+Dy[i])>0 && (X+Dx[i])<N+1 && (Y+Dy[i])<M+1 )
#define Null ( Mat[X+Dx[i]][Y+Dy[i]]==0 )
#define True ( Val == K )

void Fill(int X,int Y,int Pas,int Val)
{
    if ( Final )
    {
        if ( True )
            if ( Pas < Min )
                Min=Pas;
        return;
    }

    if ( Pas > Min )
        return;

    for (int i=1;i<=4;++i)
        if ( In && (!Null) )
        {
            int v=Mat[X][Y];
            Mat[X][Y]=0;
            X+=Dx[i],Y+=Dy[i];

            int V=Val;

            int xy=Cmmdc[Piv[K]][X][Y];
            Val=(Val*xy)/Cmmdc2[Piv[xy]][Piv[Val]];
            Fill(X,Y,Pas+1,Val);

            Val=V;

            X-=Dx[i],Y-=Dy[i];
            Mat[X][Y]=v;
        }
}

int main()
{
    freopen("kdrum.in","r",stdin);
    freopen("kdrum.out","w",stdout);

    scanf("%d%d%d",&N,&M,&K);
    scanf("%d%d",&Beg.x,&Beg.y);
    scanf("%d%d",&End.x,&End.y);

    for (int i=1;i<=N;++i)
        for (int j=1;j<=M;++j)
            scanf("%d",&Mat[i][j]);

    for (int D=1;D<=K;++D)
        Div[++Nbr]=( K%D ) ? Div[--Nbr] : D;

    for (int i=1;i<=Nbr;++i)
        Piv[Div[i]]=i;

    for (int D=1;D<=Nbr;++D)
        for (int i=1;i<=N;++i)
            for (int j=1;j<=M;++j)
                Cmmdc[D][i][j]=Euclid(Mat[i][j],Div[D]);
    for (int D=1;D<=Nbr;++D)
        for (int D2=1;D2<=Nbr;++D2)
            Cmmdc2[D][D2]=Euclid(Div[D],Div[D2]);

    int Val=1;
    int xy=Cmmdc[Piv[K]][Beg.x][Beg.y];
    Val=(Val*xy)/Cmmdc2[Piv[xy]][Piv[Val]];

    Fill(Beg.x,Beg.y,1,Val);

    printf("%d\n",Min);
}