Cod sursa(job #929168)

Utilizator superman_01Avramescu Cristian superman_01 Data 26 martie 2013 21:31:08
Problema Kdrum Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<cstdio>
#include<queue>
#include<vector>
#include<cmath>

#define mk make_pair
#define f first
#define s second

FILE *f=fopen("kdrum.in","r");
FILE *g=fopen("kdrum.out","w");

using namespace std;

int dx[]={0,0,1,-1}, dy[]={1,-1,0,0};
queue < pair< pair<int,int>,int> > Q;
int poz[12002],div[200],div_len,x1,x2,y11,y2;
int a[52][52],n,m,k,d[52][52][200];

inline int cmmdc( int a, int b)
{
    int r=a%b;
    while(r)
    {
        a=b;
        b=r;
        r=a%b;
    }
    return b;
}
int main( void )
{
    fscanf(f,"%d%d%d",&n,&m,&k);
    fscanf(f,"%d%d%d%d",&x1,&x2,&y11,&y2);
    for(int i(1); i <= n ;++i )
        for(int ii(1) ; ii <= m ; ++ii )
           fscanf(f,"%d",&a[i][ii]);
    for(int i(1); i <= k ; ++i )
           if( k % i == 0)
    {
        div[++div_len]=i;
       poz[i]=div_len;
     }
     fclose(f);
     Q.push(mk(mk(x1,y11),poz[cmmdc(k,a[x1][y11])]));
     d[x1][y11][Q.front().s]=1;
     for(;!Q.empty();Q.pop())
     {
       int x=Q.front().f.f;
       int y=Q.front().f.s;
       int z=Q.front().s;
       for(int i(0) ; i < 4 ; ++i )
       {
           int xnou=x+dx[i];
           int ynou=y+dy[i];
         if(xnou<1 || xnou >n || ynou<1 || ynou>m || !a[xnou][ynou]  ) continue;
         int t=poz[cmmdc(k,div[z]*a[xnou][ynou])];
         if(!d[xnou][ynou][t] || d[xnou][ynou][t] > d[x][y][z] +1 )
         {
            d[xnou][ynou][t]=d[x][y][z]+1;
            Q.push(mk(mk(xnou,ynou),t));
         }

       }
      }
     fprintf(g,"%d",d[x2][y2][div_len]);
     fclose(g);
     return 0;
}