Cod sursa(job #1343824)

Utilizator serbanSlincu Serban serban Data 15 februarie 2015 22:47:40
Problema Kdrum Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 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];
bool cmc[55][55][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;

int cmmdc(int q,int w)
{
    if(q<w)
    {
        int aux=q;
        q=w;
        w=aux;
    }
    if(q==0 || w==0)
        return max(q,w);
    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;
    FILE *f=fopen("kdrum.in","r");
    FILE *g=fopen("kdrum.out","w");
    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;
    }
    q=d[0];
    if(k/j!=sqrt(k))
        d[0]++,d[d[0]]=i;
    for(i=q-1;i>=1;i--)
        d[0]++,d[d[0]]=k/d[i];
    z=cmmdc(a[c[1].x][c[1].y],k);
    poz=cauta(z,1,d[0]);
    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];
            if(a[X][Y])
                for(i=1;i<=d[0];i++)
                {
                    if(cmc[c[in].x][c[in].y][i])
                        {
                        z=cmmdc(d[i]*a[X][Y],k);
                        poz=cauta(z,1,d[0]);
                        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;
                        }
                        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;
}