Cod sursa(job #2310453)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 31 decembrie 2018 17:16:20
Problema Kdrum Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("kdrum.in");
ofstream g ("kdrum.out");
int n,m,k,xs,xf,ys,yf,ft[12005],v[12005],ta[100005],d[55][55][105],a[55][55],dx[]={-1,1,0,0},dy[]={0,0,-1,1};
struct usu
{
    int x,y,k;
};
queue <usu> q;
void solve()
{
    memset(d,0x3f,sizeof(d));
    q.push({xs,ys,v[__gcd(k,a[xs][ys])]});
    d[xs][ys][v[__gcd(k,a[xs][ys])]]=1;
    while(!q.empty())
    {
        int x=q.front().x,y=q.front().y,w=q.front().k;
        q.pop();
        for(int dir=0;dir<4;++dir)
        {
            int l=x+dx[dir];
            int c=y+dy[dir];
            if(!(l&&c&&l<=n&&c<=m)||!a[l][c]) continue;
            int val=a[l][c]*v[w];
            val=ta[val];
            val=ft[val];
            if(d[l][c][val]>d[x][y][w]+1)
            {
                d[l][c][val]=d[x][y][w]+1;
                if(l==xf&&c==yf&&val==2) return;
                q.push({l,c,val});
            }
        }
    }
}
int main()
{
    f>>n>>m>>k;
    f>>xs>>ys>>xf>>yf;
    for(int i=1;i<=100000;++i) ta[i]=__gcd(i,k);
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            f>>a[i][j];
            a[i][j]=ta[a[i][j]];
        }
    }
    int usu=0;
    for(int i=1;i*i<=k;++i)
    {
        if(k%i==0)
        {
            ft[i]=++usu;
            v[usu]=i;
            if(k/i!=i)
            {
                ft[k/i]=++usu;
                v[usu]=k/i;
            }
        }
    }
    solve();
    if(k==1) g<<d[xf][yf][1];
    else g<<d[xf][yf][2];
    return 0;
}