Cod sursa(job #1555330)

Utilizator elevenstrArina Raileanu elevenstr Data 22 decembrie 2015 17:13:35
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 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  0xfffffff
int n,m,k,mat[60][60];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int dist[53][53][12009],el,divi[12009],poz[12008];
int cmmdc(int a, int b)
{
    int r;
    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
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 x,int y,int nr_div)
{   for(int i=1;i<=n;i++)
   for(int j=1;j<=m;j++)
    for(int elf=0;elf<=el;elf++)
    dist[i][j][elf]=INF;
    dist[x][y][nr_div]=1;
    Q.push(m_s(x,y,nr_div));
    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))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)
            {
                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;
    in>>n>>m>>k;
    in>>xs>>ys>>xf>>yf;
     el=0;
    for (int i=1;i<=k;i++)
      if(k%i==0){divi[++el]=i; poz[i]=el;}
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        in>>mat[i][j];
    int pas=poz[cmmdc(mat[xs][ys],k)];
     bfs(xs,ys,pas);
    out<<dist[xf][yf][el];

    return 0;
}