Cod sursa(job #2110167)

Utilizator 3DwArDPauliuc Edward 3DwArD Data 20 ianuarie 2018 12:50:39
Problema Kdrum Scor 0
Compilator cpp Status done
Runda evaluare_cex_sv_cls_x_2 Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("kdrum.in");
ofstream g("kdrum.out");
int n,m,k,xi,yi,xf,yf;
int a[52][52];
int b[52][52];
int ind[12002];
int d[12002];
int diri[]={-1,0,1,0};
int dirj[]={0,1,0,-1};
int ver(int i,int j){
    return (i>0&&i<=n&&j>0&&j<=m&&a[i][j]!=-1);
}
int cmmdc(int a,int b){
    if(b==0)return a;
    return cmmdc(b,a%b);
}
int lee(){
    deque <int> di,dj,nr;
    di.push_back(xi);
    dj.push_back(yi);
    nr.push_back(d[a[xi][yi]]);
    b[xi][yi]=1;
    while(!di.empty()){
        int ii=di.front();
        int jj=dj.front();
        int nnr=nr.front();
        di.pop_front();
        dj.pop_front();
        nr.pop_front();
        if(ii==xf&&jj==yf&&nnr==d[k])return b[xf][yf];
        for(int dir=0;dir<=3;dir++){
            int ni=ii+diri[dir],nj=jj+dirj[dir];
            if(ver(ni,nj)){
            int indice=d[cmmdc(a[ni][nj]*ind[nnr],k)];
                b[ni][nj]=b[ii][jj]+1;
                di.push_back(ni);
                dj.push_back(nj);
                nr.push_back(indice);

            }
        }

    }
    return b[xf][yf];
}
void citire(){
    f>>n>>m>>k>>xi>>yi>>xf>>yf;
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){
            int x;
            f>>x;
            if(x==0)a[i][j]=-1;
            else {
                    a[i][j]=cmmdc(k,x);
            }
    }
}

void rez(){
    int nrdiv=0,i=2;
    d[1]=1;
    while(i<=k){
        if(k%i==0){
            d[i]=nrdiv;
            ind[nrdiv]=i;
            nrdiv++;
        }i++;
    }
}
int main(){
    citire();
    rez();
    g<<lee()<<"\n";
    return 0;
}