Cod sursa(job #1338916)

Utilizator retrogradLucian Bicsi retrograd Data 10 februarie 2015 15:29:50
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include<fstream>
#include<bitset>
#include<vector>
#include<queue>

using namespace std;
typedef int var;

ifstream fin("kdrum.in");
ofstream fout("kdrum.out");

const var MAXN = 52;
var MAXC = 8195;

struct Node {
    var x, y, len, conf;
    Node(const var &a, const var &b, const var &c, const var &d) {
        x = a;
        y = b;
        conf = c;
        len = d;
    }
};

var K[MAXN][MAXN];
var xi, yi, xf, yf;
var final;
vector<var> DIV;
vector<bool> COMP[MAXN][MAXN];
queue<Node> Q;

var DX[] = {1, 0, -1, 0},
    DY[] = {0, 1, 0, -1};

var conf(var config, var num) {
    for(var i=0; i<DIV.size(); ++i) {
        if(!(config & (1 << i)) && num % DIV[i] == 0) {
            config |= (1 << i);
            num /= DIV[i];
        }
    }
    return config;
}

int main() {
    var m, n, k;
    fin>>m>>n>>k;
    for(var i=2; i<=k; i++) {
        while(k%i == 0) {
            DIV.push_back(i);
            k /= i;
            final <<= 1;
            final |= 1;
        }
    }

    MAXC = (1 << (DIV.size()));


    fin>>xi>>yi>>xf>>yf;

    for(var i=1; i<=m; i++) {
        for(var j=1; j<=n; j++) {
            fin>>K[i][j];
            COMP[i][j].resize(MAXC);
        }
    }

    Q.push(Node(xi, yi, conf(0, K[xi][yi]), 1));
    COMP[xi][yi][Q.front().conf] = 1;

    if(xi == xf && yi == yf && Q.front().conf == final) {
        fout<<1;
        return 0;
    }

    var nx, ny, nconf;

    while(!Q.empty()) {
        Node n = Q.front();
        Q.pop();
        for(var i=0; i<4; i++) {
            nx = n.x + DX[i];
            ny = n.y + DY[i];
            nconf = conf(n.conf, K[nx][ny]);

            if(K[nx][ny] == 0 || COMP[nx][ny][nconf])
                continue;

            if(nx == xf && ny == yf && nconf == final) {
                fout<<n.len+1;
                return 0;
            }

            Q.push(Node(nx, ny, nconf, n.len+1));
            COMP[nx][ny][nconf] = 1;
        }
    }


    return 0;
}