Pagini recente » Cod sursa (job #1799431) | Cod sursa (job #815955) | Cod sursa (job #1914631) | Cod sursa (job #2079556) | Cod sursa (job #1338914)
#include<fstream>
#include<bitset>
#include<vector>
#include<queue>
using namespace std;
typedef short 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;
}