Pagini recente » Cod sursa (job #1479333) | Cod sursa (job #489149) | Cod sursa (job #2851375) | Cod sursa (job #1201601) | Cod sursa (job #311992)
Cod sursa(job #311992)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
struct punct {
int x, y, v;
punct() {}
punct ( int X, int Y, int V ) { x = X; y = Y; v = V; }
};
const int N_MAX = 50;
const int K_MAX = 12000;
const int DIV_MAX = 128;
const int ND = 4;
const punct D[ND] = { punct(1,0,0), punct(0,-1,0), punct(-1,0,0), punct(0,1,0) };
int n,m,k;
int a[N_MAX][N_MAX];
int d[DIV_MAX][N_MAX][N_MAX];
vector<int> divs;
int pdiv[K_MAX+1];
punct st,en;
void divizori() {
for (int i = 1; i <= k; ++i) {
if (k % i == 0) {
pdiv[i] = divs.size();
divs.push_back(i);
}
}
}
inline int cmmdc ( int a, int b ) {
if (b == 0)
return a; else
return cmmdc(b,a%b);
}
int bf() {
divizori();
queue<punct> q;
d[pdiv[a[st.x][st.y]]][st.x][st.y] = 1;
for (q.push(punct(st.x,st.y,a[st.x][st.y])); !q.empty(); q.pop()) {
for (int i = 0; i < ND; ++i) {
punct next(q.front().x + D[i].x, q.front().y + D[i].y, 0);
if (0 <= next.x && next.x < n && 0 <= next.y && next.y < m && a[next.x][next.y] && !d[pdiv[next.v = cmmdc(q.front().v * a[next.x][next.y], k)]][next.x][next.y]) {
q.push(next);
d[pdiv[next.v]][next.x][next.y] = d[pdiv[q.front().v]][q.front().x][q.front().y] + 1;
}
}
}
return d[divs.size()-1][en.x][en.y];
}
int main() {
freopen("kdrum.in","rt",stdin);
freopen("kdrum.out","wt",stdout);
scanf("%d %d %d",&n,&m,&k);
scanf("%d %d %d %d",&st.x,&st.y,&en.x,&en.y);
--st.x; --st.y; --en.x; --en.y;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
scanf("%d",&a[i][j]);
printf("%d\n",bf());
return 0;
}