Cod sursa(job #2237555)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 2 septembrie 2018 12:01:30
Problema Kdrum Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 50
#define DIR 4

typedef struct {
    int x, y, val, d;
} coord;

coord q[1 + NMAX * NMAX * NMAX];
int n, m, k, x1, y1, x2, y2;
int parc[1 + NMAX + 1][1 + NMAX + 1];
int ldir[] = { -1, 0, 1, 0};
int cdir[] = {0, 1, 0, -1};
char viz[1 + NMAX][1 + NMAX];

int main() {
    FILE *fin = fopen ( "kdrum.in", "r" );
    fscanf ( fin, "%d%d%d", &n, &m, &k );
    fscanf ( fin, "%d%d%d%d", &x1, &y1, &x2, &y2 );
    int l, c;
    for ( l = 1; l <= n; ++l ) {
        for ( c = 1; c <= m; ++c ) {
            fscanf ( fin, "%d", &parc[l][c] );
            parc[l][c] %= k;
        }
    }
    fclose ( fin );

    int vf = 0;
    int last = 0;
    q[0] = ( coord ) {x1, y1, parc[x1][y1], 1};
    int sol = 0;
    while (vf <= last && sol == 0 ) {
        int x = q[vf].x;
        int y = q[vf].y;
        int val = q[vf].val;
        int d = q[vf].d;
        viz[x][y] = 1;
        ++vf;
        if ( x == x2 && y == y2 && val == 0 )
            sol = d;
        else {
            int i;
            for ( i = 0; i < DIR; ++i ) {
                l = x + ldir[i];
                c = y + cdir[i];
                if ( parc[l][c] > 0 && viz[l][c] == 0)
                    q[++last] = ( coord ) {l, c, ( val * parc[l][c] ) % k, d + 1};
            }
        }
    }

    FILE *fout = fopen ( "kdrum.out", "w" );
    fprintf ( fout, "%d", sol );
    fclose ( fout );

    return 0;
}