Cod sursa(job #2119484)

Utilizator RaduToporanRadu Toporan RaduToporan Data 1 februarie 2018 12:07:43
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;
struct tri
{
    int x,y,d;
};
queue <tri> q;
int a[55][55],i,j,v[55][55][100],n,m,k,divizori,x1,y1,x2,y2,numar[100];
int dx[]={0, 1, 0, -1};
int dy[]={1, 0, -1, 0};

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

void lee()
{
    int i,d,indiced,indicediv,div;
    tri el;
    d=cmmdc(a[x1][y1],k);
    indiced=numar[d];
    q.push({x1,y1,d});
    v[x1][y1][indiced]=1;
    while (!q.empty())
    {
        el=q.front();
        q.pop();
        for (i=0; i<=3; i++)
        {
            x1=el.x+dx[i];
            y1=el.y+dy[i];
        if (a[x1][y1]>0)
            {
                div=cmmdc(el.d,k);
                indicediv=numar[div];
                if (div==el.d) //or
         //(v[x1][y1][indicediv]>0 && v[el.x][el.y][numar[el.d]]+1<v[x1][y1][indicediv]))
         a[el.x][el.y]=0;
                    else v[x1][y1][indicediv]++;
            }
        }
    }
    printf("%d\n",v[n][m][divizori]);
}

int main()
{
    freopen("kdrum.in","r",stdin);
    freopen("kdrum.out","w",stdout);
    scanf("%d%d%d%d%d%d%d",&n,&m,&k,&x1,&y1,&x2,&y2);
    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)
    {
        divizori++;
        numar[i]=divizori;
    }
    lee();
    return 0;
}