Cod sursa(job #1280071)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 1 decembrie 2014 14:06:30
Problema Kdrum Scor 100
Compilator cpp Status done
Runda tema_grf Marime 1.36 kb
#include<fstream>
#include<queue>

using namespace std;

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

int n, m, k, d, x1, x2, nrd, y1, y2, i, j, x, y, z, xnou, ynou, znou;
int viz[55][55][205], a[55][55], fact[205], p[12100];

struct nod
{
    int x, y, z;
};

queue<nod>q;

int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};

int cmmdc(int x, int y)
{
    if(y==0) return x;
    return cmmdc(y, x%y);
}

 bool ein(int x,int y)
{
    if(x<1||y<1||x>n||y>m) return 0;
    return 1;
}

int main()
{
    f>>n>>m>>k>>x1>>y1>>x2>>y2;

    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)
    {
        ++nrd;
        fact[nrd]=i;
        p[i]=nrd;
    }

    viz[x1][y1][p[cmmdc(k,a[x1][y1])]]=1;

    q.push((nod){x1, y1, p[cmmdc(k,a[x1][y1])]});

    while(!q.empty())
    {
        x=q.front().x;
        y=q.front().y;
        z=q.front().z;
        q.pop();
        for(d=0;d<=3;++d)
        {
            xnou=x+dx[d];
            ynou=y+dy[d];

            if(!ein(xnou,ynou)||!a[x][y]) continue;

            znou=p[cmmdc(a[xnou][ynou]*fact[z],k)];

            if(viz[xnou][ynou][znou]) continue;

            viz[xnou][ynou][znou]=viz[x][y][z]+1;

            q.push((nod){xnou,ynou,znou});
        }
    }

    g<<viz[x2][y2][p[k]]<<'\n';
    return 0;
}