Cod sursa(job #2110161)

Utilizator TlinxSalagean Dragos Tlinx Data 20 ianuarie 2018 12:47:09
Problema Kdrum Scor 0
Compilator cpp Status done
Runda evaluare_cex_sv_cls_x_2 Marime 3.18 kb
#include <fstream>

using namespace std;


    ifstream in("kdrum.in");
    ofstream out("kdrum.out");


int cmmdc(int a,int b)
{
    int r;
    r=a%b;
    while(r)
    {
        a=b;
        b=r;
        r=a%b;
    }
    if(a!=0)
        return b;
    else
        return 0;
}

int n,m,k,x1,y1,x2,y2,scazut;
int matrice[51][51],divpl[110];
int divizoriNr[251][110];

bool Mers[51][51];
int minimPasi=100000000;

int BKTStraight(int i,int j,int nrPasi)
{
    if(i==x2&&j==y2)
    {
        if(minimPasi>nrPasi)
            minimPasi=nrPasi;
    }
    if(Mers[i][j+1]==0&&matrice[i][j+1]!=0)
        {
            Mers[i][j+1]=1;
            scazut=scazut*(cmmdc (Mers[i][j+1],k/scazut));

            BKTStraight(i,j+1,nrPasi+1);
            Mers[i][j+1]=0;
        }
        if(Mers[i+1][j]==0&&matrice[i+1][j]!=0)
        {
            Mers[i+1][j]=1;
            scazut=scazut*(cmmdc (Mers[i+1][j],k/scazut));

            BKTStraight(i+1,j,nrPasi+1);
            Mers[i+1][j]=0;
        }
        if(Mers[i][j-1]==0&&matrice[i][j-1]!=0)
        {
            Mers[i][j-1]=1;
            scazut=scazut*(cmmdc (Mers[i][j-1],k/scazut));

            BKTStraight(i,j-1,nrPasi+1);
            Mers[i][j-1]=0;
        }
        if(Mers[i-1][j]==0&&matrice[i-1][j]!=0)
        {
            Mers[i-1][j]=1;
            scazut=scazut*(cmmdc (Mers[i-1][j],k/scazut));

            BKTStraight(i-1,j,nrPasi+1);
            Mers[i-1][j]=0;
        }
}


int nushBKT(int i,int j,int nrPasi)
{
    if(i==x2&&j==y2){
        if(scazut==k)
        {
            if(minimPasi>nrPasi)
            minimPasi=nrPasi;
        }
    }
    else
    {
        if(matrice[i][j+1]!=0)
        {
            Mers[i][j+1]=1;
            scazut=scazut*(cmmdc (matrice[i][j+1],k/scazut));
            if(scazut!=k)
            nushBKT(i,j+1,nrPasi+1);else
                BKTStraight(i,j+1,nrPasi+1);
            Mers[i][j+1]=0;
        }
        if(matrice[i+1][j]!=0)
        {
            Mers[i+1][j]=1;
            scazut=scazut*(cmmdc (matrice[i+1][j],k/scazut));
            if(scazut!=k)
            nushBKT(i+1,j,nrPasi+1);
            else
                BKTStraight(i+1,j,nrPasi+1);
            Mers[i+1][j]=0;
        }
        if(matrice[i][j-1]!=0)
        {
            Mers[i][j-1]=1;
            scazut=scazut*(cmmdc (matrice[i][j-1],k/scazut));
            if(scazut!=k)
            nushBKT(i,j-1,nrPasi+1);
            else
                BKTStraight(i,j-1,nrPasi+1);
            Mers[i][j-1]=0;
        }
        if(matrice[i-1][j]!=0)
        {
            Mers[i-1][j]=1;
            scazut=scazut*(cmmdc (matrice[i-1][j],k/scazut));
            if(scazut!=k)
            nushBKT(i-1,j,nrPasi+1);
            else
                BKTStraight(i-1,j,nrPasi+1);
            Mers[i-1][j]=0;
        }
    }
}

int main()
{

    in>>n>>m>>k;

    in>>x1>>y1>>x2>>y2;
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
        in>>matrice[i][j];
        matrice[i][j]=cmmdc(matrice[i][j],k);
    }
    scazut=matrice[x1][y1];
    Mers[x1][y1]=1;
    nushBKT(x1,y1,1);
    out<<minimPasi;

    return 0;
}