假设我有一个算法可以在 n
维的棋盘上下棋,使用 {1,...,8}^n
n
维正方形。
给定一个 n
维数组或用于棋盘表示的 ArrayList,该算法本身在 n
维度上工作没有问题。问题是 n
是在运行时指定的。
有什么优雅的方法可以生成和使用这样一个 n
维的棋盘吗?
我想到的是一个递归函数,用于创建一个 n
维 ArrayList,如果 n == 1
则返回一个整数 ArrayList,并返回一个 ArrayList ArrayLists,其中第二组 ArrayLists 的每个 ArrayList 具有维度 n-1
。
但这似乎一点也不优雅......
[编辑]
在我发表评论之前似乎已被删除的答案建议生成一个列表,其中包含其他大小为 8 的列表。如果我在第一个列表中使用 8 ^ numberOfDimensions
多个列表,则此可能会起作用,但它会迫使我手动跟踪尺寸。
最佳答案
我认为一个很好的棋盘数据结构可以使用 Map
。这使得可以根据 n
整数索引的 List
查找位置:
Map<List<Integer>, BoardCell> chessboard;
BoardCell
类可能也需要对其索引的引用,以便您可以检查哪些棋子威胁到其他棋子等:
class BoardCell {
private final List<Integer> index;
private final Figure figure;
}
生成棋盘当然很慢(指数渐近)并且通过枚举所有可能的棋盘位置来完成,您可以递归地进行。
这感觉比 List
的 List
的 List
等更优雅
正如 Viliam Búr 在评论部分建议的那样,使用 Map
数据结构可以让您仅跟踪相关的棋盘单元格。这种类型的数据结构称为 Sparse代表。
关于java - 运行时指定的数组/ArrayList 的维数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19537621/