Cod sursa(job #2519050)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 7 ianuarie 2020 00:01:43
Problema Kdrum Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <queue>

using namespace std;

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

int n,m,i,j,k;
int a[51][51];
int drum[51][51];
int aux[51][51];
int l1,c1, l2,c2;

queue < pair < int, int > > coada;

int x,y, xx,yy;
int dx[4]={1, -1, 0,  0};
int dy[4]={0,  0, 1, -1};

bool c[12001];
int p[1439], nrp;

void ciur(int x)
{
    int i,j;
    for (i=2;i<=x;i++)
        if (!c[i])
        {
            nrp++;
            p[nrp]=i;
            for (j=i*2;j<=x;j+=i)
                c[j]=1;
        }
}

bool inauntru(int x, int y)
{
    return (x>=1 && x<=n && y>=1 && y<=m);
}

void constr(int x, int &aux)
{
    for (int i=1;i<=nrp && p[i]<=x && p[i]<=aux;i++)
        while (x%p[i]==0 && aux%p[i]==0)
        {
            x=x/p[i];
            aux=aux/p[i];
        }
}

int main()
{
    f>>n>>m>>k;
    f>>l1>>c1>>l2>>c2;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
        {
            f>>a[i][j];
            aux[i][j]=k;
        }

    ciur(k);

    drum[l1][c1]=1;
    coada.push(make_pair(l1, c1));
    while (!coada.empty())
    {
        x=coada.front().first;
        y=coada.front().second;
        coada.pop();
        constr(a[x][y], aux[x][y]);
        for (i=0;i<4;i++)
        {
            xx=x+dx[i];
            yy=y+dy[i];
            if (inauntru(xx, yy) && (drum[xx][yy]==0 || aux[x][y]<aux[xx][yy]))
            {
                drum[xx][yy]=drum[x][y]+1;
                aux[xx][yy]=aux[x][y];
                coada.push(make_pair(xx, yy));
            }
        }
    }

    g<<drum[l2][c2];

    return 0;
}