Cod sursa(job #1344130)

Utilizator HDT_TibiHudema Dumitru Tiberiu HDT_Tibi Data 16 februarie 2015 13:41:03
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <queue>
using namespace std;

ifstream fin("kdrum.in");
ofstream fout("kdrum.out");

struct Nod{int x,y,div,pas;};

queue<Nod> lista;
int n,m,k,xi,yi,xf,yf,a[51][51],dx[]={-1,0,1,0},dy[]={0,1,0,-1},pas=1,b[51][51][1000];

void citire()
{
    fin>>n>>m>>k;
    fin>>xi>>yi>>xf>>yf;
    for(int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
            fin>>a[i][j];
}

int cmmdc(int a, int b)
{
    if(a>b)return cmmdc(a-b,b);
    else if(a<b)return cmmdc(a,b-a);
    else return a;
}

void add(int x,int y, int div, int pas)
{
    Nod t;
    t.x=x;
    t.y=y;
    t.pas=pas;
    t.div=div;
    lista.push(t);
    b[x][y][div]=1;
}

void rezolvare()
{
    add(xi ,yi ,cmmdc(a[xi][yi],k) ,1 );

    while ( !lista.empty() )
    {
        Nod t=lista.front();
        lista.pop();

        for(int i=0; i<=3; i++)
        {
            int nx=t.x+dx[i];
            int ny=t.y+dy[i];

            if(a[nx][ny]!= 0){
                int d= t.div * cmmdc( a[nx][ny] ,k );

                if(b[nx][ny][d]!=1){
                    if(nx==xf and ny==yf and d==k) {fout<<t.pas+1<<endl; return;}
                    add(nx,ny,d,t.pas+1);
                }
            }
        }
    }
}

int main()
{
    citire();
    rezolvare();
    return 0;
}