Cod sursa(job #1342512)

Utilizator EberardoVladianu Cosmin Eberardo Data 14 februarie 2015 09:46:05
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.06 kb
#include <fstream>

using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
short n,m,k,x1,y1,x2,y2,num,v1[12001],v2[12001];
int a[53][53];
bool b[53][53][12001];
struct structura2
{
    int x,y,d,nr;
} s[500000],sol;
void citire()
{
    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];
}
short cmmdc(int a,int b)
{
    int r;
    if(a<b)
    {
        a=a+b;
        b=a-b;
        a=a-b;
    }
    while(b!=0)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
void divi()
{
    num++;
    v1[1]=1;
    v2[1]=1;
    if(k==1) return;
    for(short d=2; d<=k/2; d++)
        if(k%d==0)
        {
            v1[d]=++num;
            v2[num]=d;
        }
    num++;
    v1[k]=num;
    v2[num]=k;
}
bool egal(structura2 i,structura2 j)
{
    if(i.x!=j.x) return 0;
    if(i.y!=j.y) return 0;
    if(i.d!=j.d)  return 0;
    return 1;

}
void rez()
{
    unsigned long long div;
    short lin,col;
    unsigned long long num=1,poz=1;
    s[1].x=x1;
    s[1].y=y1;
    s[1].d=v1[cmmdc(a[x1][y1],k)];
    s[1].nr=1;
    b[x1][y1][s[1].d]=1;
    while(!egal(s[poz],sol))
    {
        lin=s[poz].x;
        col=s[poz].y;
        if(a[lin][col-1]!=0)
        {
            if(!b[lin][col-1][s[poz].d])
            {
                b[lin][col-1][s[poz].d]=1;
                num++;
                s[num].x=lin;
                s[num].y=col-1;
                div=cmmdc(a[lin][col-1],k);
                s[num].d=v1[cmmdc(div*v2[s[poz].d],k)];
                s[num].nr=s[poz].nr+1;
            }

        }
        if(a[lin][col+1]!=0)
        {
            if(!b[lin][col+1][s[poz].d])
            {

                b[lin][col+1][s[poz].d]=1;
                num++;
                s[num].x=lin;
                s[num].y=col+1;
                div=cmmdc(a[lin][col+1],k);
                s[num].d=v1[cmmdc(div*v2[s[poz].d],k)];
                s[num].nr=s[poz].nr+1;

            }
        }
        if(a[lin-1][col]!=0)
        {
            if(!b[lin-1][col][s[poz].d])
            {

                b[lin-1][col][s[poz].d]=1;
                num++;
                s[num].x=lin-1;
                s[num].y=col;
                div=cmmdc(a[lin-1][col],k);
                s[num].d=v1[cmmdc(div*v2[s[poz].d],k)];
                s[num].nr=s[poz].nr+1;
            }

        }
        if(a[lin+1][col]!=0)
        {
            if(!b[lin+1][col][s[poz].d])
            {

                b[lin+1][col][s[poz].d]=1;
                num++;
                s[num].x=lin+1;
                s[num].y=col;
                div=cmmdc(a[lin+1][col],k);
                s[num].d=v1[cmmdc(div*v2[s[poz].d],k)];
                s[num].nr=s[poz].nr+1;

            }
        }
            poz++;
        }
        fout<<s[poz].nr;
    }
    int main()
    {
        citire();
        divi();
        sol.x=x2;
        sol.y=y2;
        sol.d=v1[k];
        rez();
        return 0;
    }