Cod sursa(job #406564)

Utilizator freak93Adrian Budau freak93 Data 1 martie 2010 17:14:42
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<fstream>
#include<queue>

using namespace std;

const char iname[]="kdrum.in";
const char oname[]="kdrum.out";
const int maxn=57;
const int maxd=85;
const int maxk=12007;
const int INF=(1<<31)-1;

ifstream f(iname);
ofstream g(oname);

int d[maxd],a[maxn][maxn][maxd],n,i,j,k,p,b[maxn][maxn],m,r,w[maxk],x1,y1,x2,y2,dx[4]={-1,0,1,0},dy[4]={0,-1,0,1},x,y,z;

int cmmdc(int a,int b)
{
    if(b==0)
        return a;
    return cmmdc(b,a%b);
}

struct mpair
{
    int x;
    int y;
    int z;
    mpair(int _x,int _y,int _z):x(_x),y(_y),z(_z){}
};
queue<mpair> Q;

int main()
{
    f>>n>>m>>k>>x1>>y1>>x2>>y2;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            f>>b[i][j];
    for(i=1;i<=k;++i)
        if(k%i==0)
            d[++r]=i,w[i]=r;

    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            for(p=1;p<=r;++p)
                a[i][j][p]=INF;

    for(i=1;i<=n;++i)
        for(p=1;p<=r;++p)
            a[i][0][p]=a[i][m+1][p]=0;
    for(i=1;i<=m;++i)
        for(p=1;p<=r;++p)
            a[0][i][p]=a[n+1][i][p]=0;

    Q.push(mpair(x1,y1,w[cmmdc(b[x1][y1],k)]));
    a[x1][y1][w[cmmdc(b[x1][y1],k)]]=1;
    while(!Q.empty())
    {
        x=Q.front().x;
        y=Q.front().y;
        z=Q.front().z;
        Q.pop();
        for(i=0;i<4;++i)
        {
            p=cmmdc(k,d[z]*b[x+dx[i]][y+dy[i]]);
            if(b[x+dx[i]][y+dy[i]]&&a[x][y][z]+1<a[x+dx[i]][y+dy[i]][w[p]])
                a[x+dx[i]][y+dy[i]][w[p]]=a[x][y][z]+1,Q.push(mpair(x+dx[i],y+dy[i],w[p]));
        }
    }

    g<<a[x2][y2][r]<<"\n";

    f.close();
    g.close();

    return 0;
}