Например, у меня есть matrix
, который выглядит следующим образом:
[1,2,3,4,5]
[1,2,3,4 ]
[1,2,3,4,5]
[1,2,3,4 ]
И мне нужно создать алгоритм для построения «головоломки» из этой матрицы. Например, с некоторыми входящими требованиями для каждого блока мне нужно разделить эту матрицу на 4 части, разделенные блоками размером [4, 6, 5, 3]
Например:
[
[{x: 1, y: 1}, {x: 1, y: 2}, {x: 1, y: 3}, {x: 2, y: 3}],
[{x: 2, y: 2}, {x: 3, y: 2}, {x: 3, y: 3}, {x: 3, y: 4}, {x: 2, y: 4}, {x: 1, y: 4}],
[{x: 2, y: 1}, {x: 3, y: 1}, {x: 4, y: 1}, {x: 5, y: 1}, {x: 4, y: 2}],
[{x: 4, y: 3}, {x: 5, y: 3}, {x: 4, y: 4}]
]
Что должно выглядеть следующим образом ( если визуализировать)
Итак, вот 2 очевидных требования:
- Два (или более) блока должны иметь одинаковую границу
- Мы должны использовать все элементы из матрицы
Я придумал это решение:
// Define grid size
const gridSize = width * height;
// Define each block proportion according to grid size
const proportion = [35, 20, 20, 15, 10].map(block => parseInt(gridSize * parseFloat(block / 100)));
const grid = [];
// Set each element of matrix to specific position on grid
const mappedGrid = matrix.map((m, mi) => m.map((a, ai) => ({ el: a, x: mi, y: ai }))).flat();
// Find element on grid
const getFromMappedGrid = ({ x, y }) => mappedGrid.find(e => e.x === x && e.y === y);
// Get neighbours of specified grid element
const getElementNeighbours = elem =>
[
getFromMappedGrid({ x: elem.x - 1, y: elem.y - 1 }),
getFromMappedGrid({ x: elem.x, y: elem.y - 1 }),
getFromMappedGrid({ x: elem.x + 1, y: elem.y - 1 }),
getFromMappedGrid({ x: elem.x - 1, y: elem.y }),
getFromMappedGrid({ x: elem.x + 1, y: elem.y }),
getFromMappedGrid({ x: elem.x - 1, y: elem.y + 1 }),
getFromMappedGrid({ x: elem.x, y: elem.y + 1 }),
getFromMappedGrid({ x: elem.x + 1, y: elem.y + 1 }),
]
.filter(Boolean);
И вот я застрял, потому что я не могу найти лог c для обхода полной сетки и получения блока в соответствии с требованиями.
Итак, мой вопрос: какой алгоритм / логи c следует использовать для генерации результата, как добавлено на примере изображения / кода?
Решение псевдокода PS с описанными шагами будет достаточно хорошо