Cod sursa(job #1760815)

Utilizator GinguIonutGinguIonut GinguIonut Data 21 septembrie 2016 12:19:48
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <queue>
#include <vector>

#define nMax 53
#define mMax 53
#define divMax 150
#define valMax 12001
#define pb push_back
#define mkp make_pair

using namespace std;

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

int n, m, k, lStart, cStart, lFinal, cFinal, nrDiv;
int dx[]={0, -1, 0, 1};
int dy[]={1, 0, -1, 0};
int viz[valMax], divisors[divMax], dp[nMax][mMax][divMax], mat[nMax][mMax];
queue<pair<pair<int, int>, int> > Q;

void read()
{
    fin>>n>>m>>k;
    fin>>lStart>>cStart>>lFinal>>cFinal;

    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            fin>>mat[i][j];
}

void compute_divisors(int k)
{
    viz[0]=++nrDiv;
    divisors[nrDiv]=0;

    for(int i=1; i<=k; i++)
    {
        if(i==mat[lStart][cStart])
        {
            viz[i]=++nrDiv;
            divisors[nrDiv]=i;
            continue;
        }

        if(k%i==0)
        {
            viz[i]=++nrDiv;
            divisors[nrDiv]=i;
        }
    }
}

void solve()
{
    compute_divisors(k);

    dp[lStart][cStart][viz[mat[lStart][cStart]]]=1;
    for(Q.push(mkp(mkp(lStart, cStart), viz[mat[lStart][cStart]])); !Q.empty();)
    {
        int lin=Q.front().first.first;
        int col=Q.front().first.second;
        int val=Q.front().second;
        Q.pop();

        for(int i=0; i<4; i++)
        {
            int linF=lin+dx[i];
            int colF=col+dy[i];

            if(viz[mat[linF][colF]] && linF>=0 && colF>=0 && linF<=n && colF<=m && mat[linF][colF])
            {
                int valF=(divisors[val]*mat[linF][colF])%k;

                if(dp[linF][colF][viz[valF]]==0)
                {
                    dp[linF][colF][viz[valF]]=dp[lin][col][val]+1;
                    Q.push(mkp(mkp(linF, colF), viz[valF]));
                }
            }
        }
    }
}

void write()
{
    fout<<dp[lFinal][cFinal][1];
}

int main()
{
    read();
    solve();
    write();
}