Cod sursa(job #1343843)

Utilizator serbanSlincu Serban serban Data 15 februarie 2015 23:18:02
Problema Kdrum Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.17 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

int n,m,a[55][55],in=1,sf=1,k,d[2500],drum[55][55],R;
bool cmc[55][55][2500],v[2500][2500],A[2500];
int dx[]={0,-1,0,1,0};
int dy[]={0,0,1,0,-1};
struct punct{
int x,y;
};
punct SF,c[55000],IN;

    FILE *g=fopen("kdrum.out","w");/*
void afisare()
{
    int i,j;
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n;j++)
            fprintf(g,"%d ",drum[i][j]);
        fprintf(g,"\n");
    }
    fprintf(g,"\n");

}*/
int cauta(int cine,int inc,int sfa);

int cmmdc(int q,int w)
{
    if(q<w)
    {
        int aux=q;
        q=w;
        w=aux;
    }
    if(q==0 || w==0)
        return cauta(max(q,w),1,d[0]);
    if(w==1 || q==1)
        return 1;
    q%=w;
    cmmdc(q,w);
}

int cauta(int cine,int inc,int sfa)
{
    if(sfa<inc)
        return sfa;
    int mij=inc+(sfa-inc)/2;
    if(d[mij]==cine)
        return mij;
    if(d[mij]<cine)
        cauta(cine,mij+1,sfa);
    else cauta(cine,inc,mij-1);
}

int main()
{
    int i,j,q,z,X,Y,poz,r,ok;
    FILE *f=fopen("kdrum.in","r");
    fscanf(f,"%d %d %d",&m,&n,&k);
    fscanf(f,"%d %d",&IN.x,&IN.y);
    c[1].x=IN.x;
    c[1].y=IN.y;
    fscanf(f,"%d %d",&SF.x,&SF.y);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            fscanf(f,"%d",&a[i][j]);
    j=sqrt(k);
    for(i=1;i<=j;i++)
    {
        if(k%i==0)
        {
            d[0]++;
            d[d[0]]=i;
            for(q=d[0];q>0;q--)
            {
                if(d[d[0]]%d[q]==0)
                    v[d[0]][q]=true;
            }
        }
    }
    q=d[0];
    if(k/j!=sqrt(k))
    {
        d[0]++;
        d[d[0]]=i;
        for(r=d[0];r>0;r--)
        {
            if(d[d[0]]%d[r]==0)
                v[d[0]][r]=true;
        }
    }
    for(i=d[0];i>=1;i--)
    {
        d[0]++;
        d[d[0]]=k/d[i];
        for(r=d[0];r>0;r--)
        {
            if(d[d[0]]%d[r]==0)
                v[d[0]][r]=true;
        }
    }
    poz=cmmdc(a[c[1].x][c[1].y],k);
    cmc[c[in].x][c[in].y][poz]=true;
    drum[IN.x][IN.y]=1;
    while(in<=sf)
    {
        for(j=1;j<=4;j++)
        {
            X=c[in].x+dx[j];
            Y=c[in].y+dy[j];
            for(i=1;i<=d[0];i++)
                A[i]=false;
            if(a[X][Y])
                for(i=d[0];i>0;i--)
                {
                    if(!A[i] && cmc[c[in].x][c[in].y][i])
                    {
                        for(r=1;r<=d[0];r++)
                            A[r]=max(A[r],v[i][r]);
                        poz=cmmdc(d[i]*a[X][Y],k);
                        if(!cmc[X][Y][poz])
                        {
                            sf++;
                            c[sf].x=X;
                            c[sf].y=Y;
                            cmc[X][Y][poz]=true;
                            drum[X][Y]=drum[c[in].x][c[in].y]+1;
                            //afisare();
                        }
                        if(cmc[SF.x][SF.y][d[0]])
                            fprintf(g,"%d\n",drum[SF.x][SF.y]),j=5,in=sf+1,i=d[0]+2;
                    }
                }
        }
        in++;
    }
    return 0;
}