Cod sursa(job #1346037)

Utilizator span7aRazvan span7a Data 17 februarie 2015 23:28:26
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include<fstream>
#include<queue>
#include<map>

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;
map<pair < pair<int ,int>  , int > , bool >b;
map<pair < pair<int ,int>  , int > , bool >::iterator it;

int poz_div[12001],poz_div2[12001];

int n,m,x1,y1,x2,y2,k,a[51][51];
int cmmdc(int a,int b)
{
    int r;
    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
void dv(int k)
{
    int poz=0,i;
    for(i=1;i*i<=k;i++)
    {
        if(k%i==0)
        {
            poz_div[i]=++poz;
            poz_div2[poz]=i;
            poz_div[k/i]=++poz;
            poz_div2[poz]=k/i;
        }
    }
    i--;
    if(i==k/i)poz_div[i]--;


}
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,cur;

    int xi_cur,yi_cur,i,dc;
    aux.x=x1;aux.y=y1;aux.div=poz_div[cmmdc(a[x1][y1],k)],aux.l=1;
    q.push(aux);
    while(!q.empty())
    {
        cur=q.front();
        q.pop();

        for(i=1;i<=4;i++)
        {
            xi_cur=cur.x+xi[i];
            yi_cur=cur.y+yi[i];

            if(a[xi_cur][yi_cur]!=0)
            {
                dc=cmmdc(poz_div2[cur.div]*a[xi_cur][yi_cur],k);


                it=b.find( make_pair ( make_pair( xi_cur,yi_cur ) ,poz_div[dc] ) ) ;

                if(it -> second == false )//b[xi_cur][yi_cur][poz_div[dc]]!=1)
                    {
                        if(xi_cur==x2&&yi_cur==y2&&dc==k){
                               g<<cur.l+1;
                               return;
                            }
                        else{
                        aux.x=xi_cur;
                        aux.y=yi_cur;
                        aux.div=poz_div[dc];
                        aux.l=cur.l+1;
                       // b.erase(it);
                       // b.insert( make_pair( make_pair ( make_pair( xi_cur,yi_cur ) ,poz_div[dc] ) , true ) ) ;
                       b[ make_pair ( make_pair( xi_cur,yi_cur ) ,poz_div[dc] ) ]=true;
                        it=b.find( make_pair ( make_pair( xi_cur,yi_cur ) ,poz_div[dc] ) ) ;
                        q.push(aux);

                        }

            }

            }

        }

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