Сгенерировать "головоломную" смесь из матрицы - PullRequest
0 голосов
/ 17 января 2020

Например, у меня есть 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}]
]

Что должно выглядеть следующим образом ( если визуализировать)
enter image description here

Итак, вот 2 очевидных требования:

  1. Два (или более) блока должны иметь одинаковую границу
  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 с описанными шагами будет достаточно хорошо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...