Cod sursa(job #2086280)

Utilizator Garen456Paun Tudor Garen456 Data 11 decembrie 2017 19:32:52
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
int a[55][55][500],n,m,k,x,y,x2,y2;
int b[500],poz[12005],M[55][55],ct;
int dl[]={0,0,-1,1};
int dc[]={1,-1,0,0};
queue<int>C;
int cmmdc(int p,int o)
{ int r;
   while(o!=0)
   { r=p%o;
     p=o;
     o=r;
   }
    return p;
}


int main()
{
    fin>>n>>m>>k;
    fin>>x>>y>>x2>>y2;
    int i,j,l,c,fact,ll,cc;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
        fin>>M[i][j];
    for(i=1;i<=k;++i)
        if(k%i==0)
    { b[++ct]=i;
        poz[i]=ct;
    }
   a[x][y][poz[cmmdc(M[x][y],k)]]=1;
   C.push(x); C.push(y); C.push(poz[cmmdc(M[x][y],k)]);
   while(!C.empty())
   { l=C.front(); C.pop(); c=C.front(); C.pop(); fact=C.front(); C.pop();
   //fout<<l<<" "<<c<<" "<<fact<<"\n";
       for(i=0;i<=3;++i)
       { ll=l+dl[i];
          cc=c+dc[i];
          if(ll>=1 && ll<=n && cc>=1 && cc<=m)
          {
              if( a[ll][cc][ poz[cmmdc(b[fact]*M[ll][cc],k) ]] ==0 || a[ll][cc][ poz[cmmdc(b[fact]*M[ll][cc],k) ]] > a[l][c][fact] +1 )
              { a[ll][cc][ poz[cmmdc(b[fact]*M[ll][cc],k)]]=a[l][c][fact] +1;
                  C.push(ll); C.push(cc); C.push( poz[cmmdc(b[fact]*M[ll][cc],k)] );
              }

          }

       }
   }

   fout<<a[x2][y2][poz[k]];
    return 0;
}