Pagini recente » Cod sursa (job #665094) | Cod sursa (job #1925294) | Cod sursa (job #1882978) | Cod sursa (job #652052) | Cod sursa (job #2355892)
///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,mx[D][D];
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);
bool mai_mica(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;urm.f=sum(crt.f,a[urm.l][urm.c]);
if(cond())
{
v.push_back(urm);
if(mai_mare(urm.f,mx[urm.l][urm.c]))
mx[urm.l][urm.c]=urm.f;
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 mai_mica(factori a, factori b)
{
for(int i=1;i<=NF;i++)
if(a.fact[i]>=b.fact[i])
return 0;
return 1;
}
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;
if(mai_mica(urm.f,mx[urm.l][urm.c]))
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]++;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
mx[i][j]=a[i][j];
}
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;
}