Cod sursa(job #2600873)

Utilizator matei123Biciusca Matei matei123 Data 13 aprilie 2020 13:39:07
Problema Kdrum Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<bits/stdc++.h>
#define NMAX 60
#define MMAX 12005
using namespace std;
ifstream f("kdrum.in"); ofstream g("kdrum.out");
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int i,j,n,m,k,P,cm,nr,la,ca,lv,cv,xi,yi,xf,yf;
int a[NMAX][NMAX],divizor[205],poz[MMAX];
short Nr[NMAX][NMAX][205];
struct element
{   int l,c,val; };
queue <element> q;
bool inside(int x, int y)
{   if (x<1 || x>n || y<1 || y>n) return 0;
    else return 1;
}
int cmmdc (int a, int b)
{   while (b)
    {   int R=a%b;
        a=b; b=R;
    }
    return a;
}
void bfs_lee()
{   Nr[xi][yi][cmmdc(k,a[xi][yi])]=1;
    element el;
    el.l=xi;
    el.c=yi;
    el.val=poz[cmmdc(k,a[xi][yi])];
    q.push(el);
    while (!q.empty())
    {   el=q.front();
        q.pop();
        la=el.l; ca=el.c; P=el.val;
        for (int lv,cv,i=0;i<4;++i)
        {   lv=la+dx[i];
            cv=ca+dy[i];
            if (inside(lv,cv) && a[lv][cv])
            {   cm=cmmdc(a[lv][cv]*divizor[P],k);
                if (! Nr[lv][cv][poz[cm]])
                {   Nr[lv][cv][poz[cm]]=Nr[la][ca][P]+1;
                    el.l=lv; el.c=cv; el.val=poz[cm];
                    q.push(el);
                }
            }
        }
    }

}
int main ()
{   f>>n>>m>>k;
    f>>xi>>yi>>xf>>yf;
    for (i=1;i<=n;++i)
        for (j=1;j<=m;++j) f>>a[i][j];
    for (i=1;i<=k;++i)
        if (k%i==0)
        {   divizor[++nr]=i;
            poz[i]=nr;
        }
    bfs_lee();
    g<<Nr[xf][yf][poz[k]];
    g.close(); return 0;
}