Cod sursa(job #1344971)

Utilizator span7aRazvan span7a Data 17 februarie 2015 09:51:45
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<fstream>
#include<queue>
using namespace std;
ifstream f("kdrum.in");
ofstream g("kdrum.out");
struct poz{
int x,y,div,l;
};
int xi[5]={0,0,0,1,-1};
int yi[5]={0,1,-1,0,0};
queue<poz>q;
bool b[51][51][100000];
int n,m,x1,y1,x2,y2,k,a[51][51];
int cmmdc(int a,int b)
{
    int r;
    while(r)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
void citire()
{
    int i,j;
    f>>n>>m>>k;
    f>>x1>>y1>>x2>>y2;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            f>>a[i][j];
}
void solve()
{
    poz aux;
    int lung =0,x_cur,y_cur,xi_cur,yi_cur,divizor,i,dc,lungime;
    aux.x=x1;aux.y=y1;aux.div=1;//cmmdc(a[x1][y1],k);
    q.push(aux);
    while(!q.empty())
    {
        x_cur=q.front().x;
        y_cur=q.front().y;
        divizor=q.front().div;
        lungime=q.front().l;
        q.pop();
          lung++;
        for(i=1;i<=4;i++)
        {
            xi_cur=x_cur+xi[i];
            yi_cur=y_cur+yi[i];
            if(a[xi_cur][yi_cur]!=0)
            {


             dc=cmmdc(divizor*a[x_cur][y_cur],k);
            if(xi_cur==x2&&yi_cur==y2)
            {
                if(!dc%k)
                    g<<lungime+1;
                 while(!q.empty()) q.pop();
                 break;
            }

            if(b[xi_cur][yi_cur][dc]!=1)
            {
                b[xi_cur][yi_cur][dc]=1;
                aux.x=xi_cur;
                aux.y=yi_cur;
                aux.div=dc;
                aux.l=lung;
                q.push(aux);
            }
            }

        }

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