Cod sursa(job #2013397)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 21 august 2017 12:44:01
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
const int Dim = 52, MaxK = 12001, Inf = 0x3f3f3f3f;
const int dx[] = { 0, 1, 0, -1};
const int dy[] = { 1, 0, -1, 0};
struct Tri {
    Tri(int _x, int _y, int _z) : x(_x), y(_y), z(_z)
    {}
    int x, y, z;

};
queue<Tri> Q;
int n, m, k;
int x1, x2, y1, y2;
int a[Dim][Dim];
int b[Dim][Dim][205];
int p[MaxK], d[MaxK];

void Read();
int Cmmdc(int a, int b);
void Bfs();
bool Ok(int x, int y);
void Fact();

int main()
{
    Read();
    Fact();
    Bfs();
    fout << b[x2][y2][p[k]];
    return 0;
}
void Read()
{
    fin >> n >> m >>  k;
    fin >> x1 >> y1 >> x2 >> y2;
    for ( int i = 1; i <= n; i++ )
        for ( int j = 1; j <= m; j++ )
            fin >> a[i][j];
}
int Cmmdc(int a, int b)
{
    int c;
    while (b)
    {
        c = b;
        b = a % b;
        a = c;
    }
    return a;
}

bool Ok(int x, int y)
{
    if ( x > n || y > m || x < 1 || y < 1 || a[x][y] == 0 )
        return false;
    return true;
}

void Bfs()
{
    int x, y, xi, yi, val, vali;
    Tri t = Tri(x1, y1, p[Cmmdc(a[x1][y1], k)]);
    b[x1][y1][Cmmdc(a[x1][y1], k)] = 1;
    Q.push(t);
    while ( !Q.empty() )
    {

        t = Q.front();
        Q.pop();
        x = t.x;
        y = t.y;
        val = t.z;
        for ( int i = 0; i < 4; i++ )
        {


            xi = x + dx[i];
            yi = y + dy[i];
            if ( Ok(xi, yi) )
            {
                vali  = Cmmdc(k, d[val] * a[xi][yi]);
                if ( !b[xi][yi][p[vali]])
                {
                    b[xi][yi][p[vali]] = b[x][y][val] + 1;
                    Q.push(Tri(xi, yi, p[vali]));
                }
            }
        }
    }
}
void Fact()
{
    int nr = 0;;
    for (int i = 1; i <= k; ++i)
        if ( k % i == 0 )
        {
            d[++nr] = i;
            p[i] = nr;
        }
    return;
}