Cod sursa(job #607961)

Utilizator SpiderManSimoiu Robert SpiderMan Data 14 august 2011 00:36:09
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
# include <cstdio>
# include <deque>
using namespace std;

const char *FIN = "kdrum.in", *FOU = "kdrum.out";
const int MAX_N = 55, MAX_D = 101, MAX_K = 12005;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};

int N, M, K, X1, Y1, X2, Y2, div;
int dv[MAX_D], pz[MAX_K], A[MAX_N][MAX_N], dp[MAX_N][MAX_N][MAX_D];

struct vec {
	int x, y, nr;
	vec () {};
	vec (int xx, int yy, int nrnr) {
	    x = xx, y = yy, nr = nrnr;
	}
} ;

deque <vec> Q;

int cmmdc (int A, int B) {
    return (B ? cmmdc (B, A % B) : A);
}

int main (void) {
    freopen (FIN, "r", stdin);

    scanf ("%d %d %d", &N, &M, &K);
    for (int i = 1; i <= K; ++i)
        if (K % i == 0)
            dv[pz[i] = ++div] = i;
    scanf ("%d %d %d %d", &X1, &Y1, &X2, &Y2);
    for (int i = 1; i <= N; ++i)
        for (int j = 1; j <= M; ++j)
            scanf ("%d", A[i] + j);
    dp[X1][Y1][pz[K / cmmdc (K, A[X1][Y1])]] = 1;
    for (Q.push_back (vec (X1, Y1, pz[K / cmmdc (K, A[X1][Y1])])); ! Q.empty (); Q.pop_front ()) {
        vec rec = Q.front ();
        for (int k = 0; k < 4; ++k) {
            vec act = rec;
            act.x += dx[k], act.y += dy[k];
            if (act.x > 0 && act.x <= N && act.y > 0 && act.y <= M && A[act.x][act.y]) {
                act.nr = pz[dv[rec.nr]] / cmmdc (A[act.x][act.y], dv[rec.nr]);
                if (dp[rec.x][rec.y][rec.nr] + 1 < dp[act.x][act.y][act.nr] || dp[act.x][act.y][act.nr] == 0) {
                    dp[act.x][act.y][act.nr] = dp[rec.x][rec.y][rec.nr] + 1;
                    Q.push_back (act);
                }
            }
        }
    }
    fprintf (fopen (FOU, "w"), "%d", dp[X2][Y2][1]);
}