Cod sursa(job #1938677)

Utilizator raulmuresanRaul Muresan raulmuresan Data 24 martie 2017 23:40:06
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include<fstream>
#include<vector>
#include<string>
#include<queue>
#define maxN 52
#define maxM 52
#define maxK 12002
#define maxD 1002
#define inf 1000000000

using namespace std;

ifstream fin("kdrum.in");
ofstream fout("kdrum.out");

struct Cell
{
    int x, y, d;
};

queue <Cell> q;


string sir;
int i, n, k, j,m,sol,x,y;
int a[maxN][maxN], dp[maxN][maxN][maxD], divizori[maxD], index[maxK];
int nrDivizori;
int x1, x2, y1, y2;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

int gcd(int x, int y)
{
    int r = x % y;
    while (r)
    {
        x = y;
        y = r;
        r = x % y;
    }
    return y;
}

void init()
{
     for (int i = 1; i <= n; ++ i)
        for (int j = 1; j <= m; ++ j)
            for (int d = 1; d <= nrDivizori; ++ d)
                dp[i][j][d] = inf;
}

bool ok(int x, int y)
{
    return (x > 0 && y > 0 && x <= n && y <= m && a[x][y]);
}



int main()
{
    fin >> n >> m >> k;
    nrDivizori = 0;
    for(i = 1; i <= k; i++)
    {
        if(k % i == 0)
        {
            divizori[++nrDivizori] = i;
            index[i] = nrDivizori;;
        }
    }

    for(i = 1; i <= nrDivizori; i++)
    {
        //fout << index[divizori[i]] << " ";
    }
    init();
    fin >> x1 >> y1 >> x2 >> y2;
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= m; j++)
        {
            fin >> a[i][j];
        }
    }
    int d = gcd(k, a[x1][y1]);
    //fout << d <<"\n";
    d = index[d];
    //fout << d << "\n";
    dp[x1][y1][d] = 1;
    q.push({x1, y1, d});
    while(! q.empty())
    {
        Cell nod = q.front();
        int x, y;
        x = nod.x;
        y = nod.y;
        q.pop();
        for(int i=0;i<=3;i++)
        {
            if(ok(x+dx[i], y+dy[i]))
            {
                d = gcd(k, a[x+dx[i]][y+dy[i]] * divizori[nod.d]);
                d = index[d];
                if(dp[x+dx[i]][y+dy[i]][d] == inf)
                {
                    dp[x+dx[i]][y+dy[i]][d] = dp[x][y][nod.d] + 1;
                    q.push({x+dx[i], y+dy[i], d});
                }
                //fout << x+dx[i] << " " << y+dy[i] << " " << d<<"\n";

                //fout << x+dx[i] << " " << y+dy[i] << " " << a[x+dx[i]][y+dy[i]]<<"\n";
                //fout << x+dx[i] << " " << y+dy[i]
            }
        }

    }
    fout << dp[x2][y2][nrDivizori] << "\n";
   // fout <<"------\n";
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= m; j++)
        {
            //fout << a[i][j] << " ";
        }
        //fout << "\n";
    }

}