Присвойте пользователям поля сетки в круглом узоре вокруг зарезервированного центрального окна. - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь найти решение / масштабируемую формулу / способ назначения блоков 2D-сетки пользователю.

Итак, давайте предположим, что я использую бесконечную сетку. Но там центральная точка (0, 0) будет его координатами. Это поле никогда не будет назначено.

Мне нужно начать с точки за пределами этого поля, скажем, (0, 1), для первого пользователя, которому будет назначен блок в сетке. Затем он перейдет к (1, 1) для следующего пользователя и (1, 0) для следующего и т. Д. И т. Д.

Затем, после того как все ящики вокруг исходной точки заявлены, переместите на следующий «слой», например [(2, 2), (2, 1), (2, 0)].

Извините, если этот вопрос был задан ранее, я не знаю, что вы будет действительно называть это.

Кроме того: я храню, сколько ящиков было назначено и информацию, как это.

Grid Visualization

1 Ответ

0 голосов
/ 01 мая 2020

Наиболее эффективным и лаконичным способом будет заранее сформировать все координаты данного слоя в список. таким образом, он становится простым алгоритмом перестановок пар чисел.

вот метод, который сгенерирует все перестановки пар для данного n от -n до n и исключая пару [0,0]. Я использую класс Pair из библиотеки Apache commons

publicList<Pair<Integer, Integer>> generateAllPerm(int n) {
    return IntStream.rangeClosed(Math.abs(n)*-1, Math.abs(n))
        .mapToObj(i -> IntStream.rangeClosed(Math.abs(n)*-1, Math.abs(n))
            .filter(j -> i != 0 || j != 0)
            .mapToObj(j -> new ImmutablePair<Integer, Integer>(i, j))
            .collect(Collectors.toList())
        ).flatMap(List::stream)
        .collect(Collectors.toList());
...