Cod sursa(job #2355727)

Utilizator IoanStoicaStoica Ioan IoanStoica Data 26 februarie 2019 11:50:31
Problema Kdrum Scor 0
Compilator cpp-64 Status done
Runda cartof123 Marime 2.4 kb
///Kdrum
///Stoica Ioan 26.01.2019
///Sursa 1
#include <bits/stdc++.h>
#define D 52

using namespace std;

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

struct factori{int fact[7];}a[D][D],DK;
struct casuta {int l,c,d;factori f;}in,fin,crt,urm;
struct pppp   {int val,put;}desck[12003],DMAX[7];

int NF;///numarul de factori
int n,m,k;int dl[]={0,0,0,1,-1},dc[]={0,1,-1,0,0};int x[D][D];
deque <casuta> v;

void desc_k();void read();int LEE();bool cond();factori sum(factori a,factori b);bool egalitate(casuta a, casuta b);
bool mai_mare(factori a, factori b);

int main()
{
    f>>n>>m>>k;
    f>>in.l>>in.c>>fin.l>>fin.c;
    desc_k();
    read () ;
    g<<LEE()<<"\n";;
}

int LEE()
{
    int i;
    in.f=a[in.l][in.c];in.d=1;
    v.push_back(in);
    while(!v.empty())
    {
        crt=v.front();
        v.pop_front();
        for(i=1;i<=4;i++)
        {
            urm.l=crt.l+dl[i];
            urm.c=crt.c+dc[i];
            urm.d=crt.d+1;
            if(cond())
            {
                urm.f=sum(crt.f,a[urm.l][urm.c]);
                v.push_back(urm);
                if(egalitate(urm,fin) && mai_mare(urm.f,fin.f))
                    return urm.d;
            }
        }
    }
    return -13;
}
bool mai_mare(factori a, factori b)
{
    for(int i=1;i<=NF;i++)
        if(b.fact[i]>a.fact[i])
            return 0;
    return 1;
}

bool egalitate(casuta a, casuta b)
{
    if(a.l==b.l && a.c==b.c)
        return 1;
    return 0;
}

factori sum(factori a,factori b)
{
    factori sol;
    for(int i=1;i<=NF;i++)
        sol.fact[i]=a.fact[i]+b.fact[i];
    return sol;
}

bool cond()
{
    if(urm.l<1 || urm.l>n || urm.c<0 || urm.c>m)
        return 0;
    if(x[urm.l][urm.c]==0)
        return 0;
    return 1;
}
void read()
{
    int i,j,nr,t;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
    {
        f>>x[i][j];nr=x[i][j];

        for(t=1;t<=NF;t++)
            if(nr%desck[t].val==0 && nr )
                while(nr%desck[t].val==0 && nr)
                {
                    nr/=desck[t].val;
                    a[i][j].fact[t]++;
                }
    }

}
void desc_k()
{
    NF=0;
    for(int i=2;i<=k;i++)
        if(k%i==0)
    {
        NF++;
        desck[NF].val=i;
        while(k%i==0)desck[NF].put++,k/=i;
    }
    for(int i=1;i<=NF;i++)
        DK.fact[i]=desck[i].put;
    fin.f=DK;
}