Cod sursa(job #1344642)

Utilizator serbanSlincu Serban serban Data 16 februarie 2015 21:19:10
Problema Kdrum Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

int n,m,a[55][55],u[55][55],D[55][55],in=1,sf=1,nr,k,d[2500],MMM;
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 ",u[i][j]);
        fprintf(g,"\n");
    }
    fprintf(g,"\n");

}

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

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

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]);
    for(i=1;i<=k;i++)
        if(k%i==0)
            nr++,d[nr]=i;
    D[IN.x][IN.y]=1;
    u[IN.x][IN.y]=cmmdc(a[IN.x][IN.y],k);
    while((u[SF.x][SF.y]!=k || !D[SF.x][SF.y]) && (in<=sf))
    {
        for(j=1;j<=4;j++)
        {
            X=c[in].x+dx[j];
            Y=c[in].y+dy[j];
            if(a[X][Y])
            {
                z=cmmdc(d[u[c[in].x][c[in].y]]*a[X][Y],k);
                if(z>u[X][Y])
                {
                    u[X][Y]=z;
                    sf++;
                    c[sf].x=X;
                    c[sf].y=Y;
                    D[X][Y]=D[c[in].x][c[in].y]+1;
                }
            }
        }
        in++;
    }
    fprintf(g,"%d\n",D[SF.x][SF.y]);
    return 0;
}