Cod sursa(job #1110064)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 17 februarie 2014 20:07:00
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<cstdio>

using namespace std;

const int MAX_N = 51 ;
const int MAX_K = 12001 ;
const int MAX_NDIV = 220 ;

int dx[] = {1,0,-1,0} ;
int dy[] = {0,-1,0,1} ;

struct celula {
                  int x,y,d;
              }c[MAX_N*MAX_N*MAX_NDIV];

int n,m,k,x1,x2,y1,y2,i,j,x,y,d,vx,vy;

int a[MAX_N][MAX_N];
int div[MAX_NDIV],v[MAX_K];
int dist[MAX_N][MAX_N][MAX_NDIV];

int ndiv;

int len;


int cmmdc(int a,int b) {
    int r;
    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}

int main() {
    freopen("kdrum.in","r",stdin);
    freopen("kdrum.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            scanf("%d",&a[i][j]);
    for(i=1;i<=k;++i)
        if(k%i==0) {
            div[++ndiv]=i;
            v[i]=ndiv;
        }
    dist[x1][y1][v[1]]=1;
    c[1].x = x1;
    c[1].y = y1;
    c[1].d = 1;
    len = 1;
    for(i=1;i<=len;++i) {
        x=c[i].x;
        y=c[i].y;
        d=c[i].d;
        for(j=0;j<4;++j) {
            vx = x+dx[j];
            vy = y+dy[j];
            if( vx>=1 && vx<=n && vy>=1 && vy<=m && a[vx][vy]!=0 ) {
                int vd=v[cmmdc(a[vx][vy]*div[d],k)];
                if(dist[vx][vy][vd]==0) {
                    len++;
                    c[len].x=vx;
                    c[len].y=vy;
                    c[len].d=vd;
                    dist[vx][vy][vd]=dist[x][y][d]+1;
                }
            }
        }
    }
    printf("%d\n",dist[x2][y2][v[k]]);
    return 0;
}