Cod sursa(job #2110157)

Utilizator SheingoldOnica Andrei Sheingold Data 20 ianuarie 2018 12:46:13
Problema Kdrum Scor 60
Compilator cpp Status done
Runda evaluare_cex_sv_cls_x_2 Marime 1.76 kb
#include <iostream>
#include<fstream>
#include<queue>

using namespace std;

struct type
{
    int l,c,divv;
}el;

queue<type> q;
int dx[]={-1,0,1,0};
int dy[]={0,-1,0,1};
int i,j,mx,d[55][55][75],a[55][55],n,m,k,v[75],f,l1,c1,l2,c2,li,ci,nr,y,unu,doi,trei,x,o[12005],nrnod;

int cmmdc()
{
    unu=f*y;
    doi=k;
    if(unu<doi) swap(unu,doi);
    while(doi!=0)
    {
        trei=unu%doi;
        unu=doi;
        doi=trei;
    }
    return unu;
}
int main()
{
    ifstream fin("kdrum.in");
    ofstream fout("kdrum.out");
    fin>>n>>m>>k>>l1>>c1>>l2>>c2;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
          fin>>a[i][j];
    for(i=1;i<=k;i++)
      if(k%i==0)
      {
          nr++;
          o[i]=nr;
          v[nr]=i;
      }
    for(j=1;j<=nr;j++)
     if(a[l1][c1]%v[j]==0)
    {
    d[l1][c1][j]=1;
    el.divv=v[j];el.l=l1;el.c=c1;q.push(el);
    }
    while(!q.empty()&&d[l2][c2][nr]==0)
    {
        y=q.front().divv;
        li=q.front().l;
        ci=q.front().c;
        nrnod=o[y];
        q.pop();
        for(i=0;i<4;i++)
        {
            el.l=li+dx[i];
            el.c=ci+dy[i];
            f=1;
            if(a[el.l][el.c]!=0)
            {
                f=a[el.l][el.c];
                x=cmmdc();
                for(j=1;v[j]<=x&&j<=nr;j++)
                {
                    if((y*f)%v[j]==0)
                    {
                        if(d[el.l][el.c][j]==0)
                        {
                            d[el.l][el.c][j]=d[li][ci][nrnod]+1;
                            el.divv=v[j];
                            q.push(el);
                        }
                    }
                }
            }
         }

    }
    fout<<d[l2][c2][nr];
    return 0;
}