在保留的中心框周围以圆形图案将网格框分配给用户

Assign grid boxes to a user in a circular pattern around the reserved center box

我正在尝试找出一个 solution/scalable formula/way 来将 2D 网格的框分配给用户。

所以让我们假设我使用的是无限网格。但是有一个中心点 (0, 0) 将是它的坐标。永远不会分配此框。

我需要从那个框外的点开始,比方说 (0, 1),以便为第一个用户分配网格上的框。然后它将为下一个用户移动到 (1, 1),为下一个用户移动到 (1, 0),依此类推。

然后在原点周围的所有方框都被认领后,移动到下一个 "layer",例如[(2, 2), (2, 1), (2, 0)].

抱歉,如果以前有人问过这个问题,我不知道你会怎么称呼它。

此外:我正在存储已分配了多少个盒子以及类似的信息。

最高效简洁的方法是将给定图层的所有坐标预先生成到列表中。这样它就变成了数字对排列的简单算法。

这里有一个方法可以为给定的 n 生成从 -nn 的对的所有排列,不包括 [0,0] 对。我正在使用来自 Apache 公共库的 Pair class

public List<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());