Cod sursa(job #1281418)

Utilizator gapdanPopescu George gapdan Data 3 decembrie 2014 09:34:35
Problema Kdrum Scor 100
Compilator cpp Status done
Runda tema_grf Marime 1.65 kb
#include<cstdio>
#include<queue>
#include<algorithm>
#define NMAX 60
#define MMAX 12005
using namespace std;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int i,j,n,m,k,P,cm,nr,la,ca,lv,cv,xi,yi,xf,yf;
int a[NMAX][NMAX],divizor[205],poz[MMAX];
short Nr[NMAX][NMAX][205];
struct element
{
    int l,c,val;
};
queue <element> q;
int verif (int x, int y)
{
    if (x<1 || x>n || y<1 || y>n) return 0;
        else return 1;
}
int cmmdc (int a, int b)
{
    int R;
    while (b)
    {
        R=a%b;
        a=b;
        b=R;
    }
    return a;
}
int main ()
{
    freopen("kdrum.in","r",stdin);
    freopen("kdrum.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    scanf("%d%d%d%d",&xi,&yi,&xf,&yf);
    for (i=1;i<=n;++i)
        for (j=1;j<=m;++j) scanf("%d",&a[i][j]);
    for (i=1;i<=k;++i)
        if (k%i==0)
        {
            divizor[++nr]=i;
            poz[i]=nr;
        }
    Nr[xi][yi][cmmdc(k,a[xi][yi])]=1;
    element el;
    el.l=xi;
    el.c=yi;
    el.val=poz[cmmdc(k,a[xi][yi])];
    q.push(el);
    while (!q.empty())
    {
        el=q.front();
        q.pop();
        la=el.l; ca=el.c; P=el.val;
        for (i=0;i<4;++i)
        {
            lv=la+dx[i];
            cv=ca+dy[i];
            if (verif(lv,cv) && a[lv][cv])
            {
                cm=cmmdc(a[lv][cv]*divizor[P],k);
                if (! Nr[lv][cv][poz[cm]])
                {
                    Nr[lv][cv][poz[cm]]=Nr[la][ca][P]+1;
                    el.l=lv; el.c=cv; el.val=poz[cm];
                    q.push(el);
                }
            }
        }
    }
    printf("%d\n",Nr[xf][yf][poz[k]]);
    return 0;
}