Cod sursa(job #798728)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 17 octombrie 2012 00:31:12
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
using namespace std;
ifstream f("kdrum.in");
#define ll long long
ofstream g("kdrum.out");
#include <queue>
#define LE1 55
#define inf 1<<30
#define Maxdiv 500
int xx[]= {1,-1,0,0};
int yy[]= {0,0,-1,1};
int best[LE1][LE1][Maxdiv];
int n,m,k,i,j;
int a[LE1][LE1];
int Fr[Maxdiv];
int value;

struct trei
{
    int lin,col,div;
};
queue <trei> que ;
trei X,X2;
int euclid(ll A,ll B)
{
    if (B==0) return A;
    return euclid(B,A%B);
}

int  BFS()
{
    while (true)
    {
        trei T=que.front();
        que.pop();

        if (T.lin==X2.lin&&T.col==X2.col&&T.div==X2.div)
            return best[T.lin][T.col][Fr[T.div]];

        for(i=0; i<4; ++i) if (a[T.lin+xx[i]][T.col+yy[i]]!=0)
            {
                value=Fr[euclid(T.div*a[T.lin+xx[i]][T.col+yy[i]],k)];
                if  (best[T.lin+xx[i]][T.col+yy[i]][value]>best[T.lin][T.col][Fr[T.div]]+1)
                {
                    best[T.lin+xx[i]][T.col+yy[i]][value]=best[T.lin][T.col][Fr[T.div]]+1;
                    X.lin=T.lin+xx[i];
                    X.col=T.col+yy[i];
                    X.div=euclid(T.div*a[T.lin+xx[i]][T.col+yy[i]],k);
                    que.push(X);
                }
            }
    }
}

int main()
{
    f>>n>>m>>k;
    f>>X.lin>>X.col>>X2.lin>>X2.col;
    for(i=1; i<=n; ++i)
        for(j=1; j<=m; ++j)
            f>>a[i][j];

    int maxd=0;

    for(i=1; i<=k; ++i)
        if (k%i==0)
        {
            ++maxd;
            Fr[i]=maxd;
        }

    for(i=1; i<=n; ++i)
        for(j=1; j<=m; ++j)
            for(int d=1; d<=maxd; ++d)
                best[i][j][d]=inf;

    X.div=a[X.lin][X.col];

    best[X.lin][X.col][X.div]=1;

    X2.div=k;

    que.push(X);

    g<<BFS()<<'\n';



    f.close();
    g.close();
    return 0;
}