Cod sursa(job #1555348)

Utilizator elevenstrArina Raileanu elevenstr Data 22 decembrie 2015 17:42:37
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("kdrum.in");
ofstream out("kdrum.out");
#define m_s(a,b,c) make_pair(make_pair(a, b),c)
#define unu first.first
#define doi first.second
#define trei second
#define INF  999999999
int n,m,k,mat[60][60];
int dx[]= {-1,1,0,0};
int dy[]= {0,0,-1,1};
int dist[53][53][12009],divi[12009],poz[12008];
int cmmdc(int a, int b)
{
    int r=a%b;
    while(r)
    {
        a=b;
        b=r;
        r=a%b;
    }
    return b;
}
bool inside(int a,int b)
{
    return a>=1 and b>=1 and a<=n and b<=m;
}
queue <pair<pair<int, int>, int > > Q;
void bfs(int a,int b,int c)
{
    dist[a][b][c]=1;
    Q.push(m_s(a,b,c));
    while(!Q.empty())
    {
        int x=Q.front().unu;
        int y=Q.front().doi;
        int nr_div=Q.front().trei;
        Q.pop();
        for(int i=0; i<4; i++)
        {
            int xn=x+dx[i];
            int yn=y+dy[i];
            if(!inside(xn,yn)||mat[xn][yn]==0)continue;
            int nr_divn=poz[cmmdc(mat[xn][yn]*divi[nr_div],k)];
            if(dist[xn][yn][nr_divn]>dist[x][y][nr_div]+1||dist[xn][yn][nr_divn]==0)
            {
                Q.push(m_s(xn,yn,nr_divn));
                dist[xn][yn][nr_divn]=dist[x][y][nr_div]+1;
            }
        }
    }
}
int main()
{
    int xs,ys,xf,yf,el;
    in>>n>>m>>k;
    in>>xs>>ys>>xf>>yf;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            in>>mat[i][j];
    el=0;
    for (int i=1; i<=k; i++)
        if(k%i==0)
        {
            divi[++el]=i;
            poz[i]=el;
        }
    int pas=poz[cmmdc(mat[xs][ys],k)];
    bfs(xs,ys,pas);
    out<<dist[xf][yf][el];

    return 0;
}