Cod sursa(job #3004620)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 16 martie 2023 14:48:54
Problema Kdrum Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
using namespace std;

const int dmax = 105;
int gcd(int a, int b)
{
	if(!b)
		return a;
	return gcd(b, a % b);
}

struct Cell{
	int x, y, div_index;
};


int solve(const vector<vector<int>>& m, int sx, int sy, int px, int py, int k)
{
	int r = m.size(), c = m[0].size();
	int d[r][c][dmax];
	memset(d, -1, sizeof(d));
	
	vector<vector<int>> g(r, vector<int>(c));
	for(int i = 0;i < r;++i)
		for(int j = 0;j < c;++j)
			g[i][j] = gcd(m[i][j], k);
	int pos[k + 1];
	vector<int> divs;
	for(int i = 1;i <= k;++i)
	{
		if(k % i == 0)
		{
			divs.push_back(i);
			pos[i] = divs.size() - 1;
		}
	}
	
	queue<Cell> q;
	q.push({sx, sy, pos[g[sx][sy]]});
	d[sx][sy][pos[g[sx][sy]]] = 0;
	int dx[] = {-1, 1, 0, 0};
	int dy[] = {0, 0, -1, 1};
	
	while(!q.empty())
	{
		auto it = q.front();
		q.pop();
		int x = it.x, y = it.y, index = it.div_index;
		if(x == px && y == py && index == (int) divs.size() - 1)
			return d[x][y][index];
		for(int i = 0;i < 4;++i)
		{
			int nx = x + dx[i], ny = y + dy[i];
			if(nx >= 0 && nx < r && ny >= 0 && ny < c && m[nx][ny])
			{
				int divis = divs[index];
				divis *= g[nx][ny];
				divis = gcd(divis, k);
				int nindex = pos[divis];
				if(d[nx][ny][nindex] == -1)
				{
					d[nx][ny][nindex] = d[x][y][index] + 1;
					q.push({nx, ny, nindex});
				}
			}
		}
	}
	return 0;
}

int main() {
	freopen("kdrum.in", "r", stdin);
	freopen("kdrum.out", "w", stdout);
	int r, c, k, sx, sy, dx, dy;
	cin >> r >> c >> k >> sx >> sy >> dx >> dy;
	--sx, --sy, --dx, --dy;
	vector<vector<int>> m(r, vector<int>(c));
	for(int i = 0;i < r;++i)
		for(int j = 0;j < c;++j)
			cin >> m[i][j];
	cout << solve(m, sx, sy, dx, dy, k) + 1 << "\n";
}