Cod sursa(job #1943651)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 28 martie 2017 18:48:48
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <queue>
#define INF 30001
using namespace std;
ifstream f("kdrum.in");
ofstream g("kdrum.out");
int n,m,MOD,NR,xi,yi,xf,yf;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int A[55][55];
short seen[100001];
short divisors[150];
short T[55][55][150];
short M[55][55][150];
bool viz[55][55][150];
queue <pair <pair<int,int> ,int> > q;
int cmmdc(int a, int b)
{
    int r=a%b;
    while(r)
    {
        a=b;
        b=r;
        r=a%b;
    }
    return b;
}
void get_divisors()
{
    int i;
    for(i=1;i<=MOD;i++)
    {
        if(!(MOD%i))
        {
            divisors[++NR]=i;
            seen[i]=NR;
        }
    }
}
bool valid(int i, int j)
{
    return (i>=1 and i<=n and j>=1 and j<=m and A[i][j]);
}
void BFS()
{
    get_divisors();
    int i,j,k,iu,ju,ku;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            for(k=1;k<=NR;k++)
            {
                M[i][j][k]=cmmdc(A[i][j]*divisors[k],MOD);
                T[i][j][k]=INF;
            }
    T[xi][yi][seen[M[xi][yi][1]]]=1;
    q.push(make_pair(make_pair(xi,yi),seen[M[xi][yi][1]]));
    while(!q.empty())
    {
        i=q.front().first.first;
        j=q.front().first.second;
        k=q.front().second;
        q.pop();
        viz[i][j][k]=false;
        for(int con=0;con<=3;con++)
        {
            iu=i+dx[con];
            ju=j+dy[con];
            if(valid(iu,ju))
            {
                ku=cmmdc(M[iu][ju][k],MOD);
                if(T[iu][ju][seen[ku]]>T[i][j][k]+1)
                {
                    T[iu][ju][seen[ku]]=T[i][j][k]+1;
                    if(!viz[iu][ju][seen[ku]])
                    {
                        viz[iu][ju][seen[ku]]=true;
                        q.push(make_pair(make_pair(iu,ju),seen[ku]));
                    }
                }
            }
        }
    }
}
int main()
{
    f>>n>>m>>MOD;
    f>>xi>>yi>>xf>>yf;
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        f>>A[i][j];
    BFS();
    g<<T[xf][yf][NR];
}