假设我有一个算法,可以使用n
{1,...,8}^n
维度方块在n
- 维度的棋盘上下棋。
对于棋盘表示,给定n
- 维数组或ArrayList,算法本身在n
维度中工作没有问题。问题是要在运行时指定n
。
有没有优雅的方法来生成和使用这样的n
维棋盘?
我想到的是一个递归函数来创建一个n
- 维ArrayList,返回一个整数的ArrayList,如果n == 1
,并返回一个ArrayList的ArrayLists,其中第二组的每个ArrayList ArrayLists的维度为n-1
。
但这似乎并不优雅......
[编辑]
在我发表评论之前似乎已删除的答案建议生成一个List,其中包含大小为8的其他列表。如果我在第一个列表中使用8 ^ numberOfDimensions
多个列表,这可能会有效,但是它会迫使我手动跟踪尺寸。
答案 0 :(得分:3)
我认为棋盘的一个不错的数据结构可以使用Map
。这样就可以根据List
n
整数索引查找位置:
Map<List<Integer>, BoardCell> chessboard;
BoardCell
类可能也希望引用其索引,以便您可以检查哪些部分威胁到其他部分等:
class BoardCell {
private final List<Integer> index;
private final Figure figure;
}
生成棋盘当然是缓慢的(指数渐近),并通过枚举所有可能的棋盘位置来完成,你可以递归地进行。
这比List
List
等List
感觉更优雅。
正如ViliamBúr在评论部分中所建议的那样,使用Map
数据结构可以让您仅跟踪相关的电路板单元。这种类型的数据结构称为Sparse表示。
答案 1 :(得分:1)
我认为这不是特别优雅,但应该可以解决这个问题:
List makeBoard(int dim) {
List res = new ArrayList(8);
for (int i = 0 ; i != 8 ; i++) {
if (dim != 1) {
res.add(makeBoard(dim-1));
} else {
res.add(0);
}
}
return res;
}
这个想法是递归地生成电路板。当dim
为1
时,请在列表中添加八个零;否则,添加八个维度dim-1
的板。