假设我有一个可以在棋盘上下棋的算法-- n-dimensional,使用{1,...,8}^n n-dimensional平方。
该算法本身在n维度上工作没有问题,给定一个n-dimensional数组或用于棋盘表示的ArrayList。问题是要在运行时指定n。
有什么优雅的方法来生成和使用这样一个n-dimensional棋盘吗?
我想到的是一个递归函数来创建一个n-dimensional ArrayList,返回一个整数的ArrayList如果n == 1,并返回一个ArrayList of ArrayLists,其中第二组ArrayLists的每个ArrayList都有维n-1。
但这看起来一点也不优雅.
编辑
在我发表评论之前,一个似乎已经被删除的答案建议生成一个列表,其中包含8大小的其他列表。如果我在第一个列表中使用多个列表,这可能会奏效,但它将迫使我手动跟踪维度。
发布于 2013-10-23 09:31:24
我认为棋盘上很好的数据结构可以使用Map。这样就可以根据List of n整数索引查找位置:
Map<List<Integer>, BoardCell> chessboard;BoardCell类可能也希望有对其索引的引用,这样您就可以检查哪些碎片威胁到其他部分,等等:
class BoardCell {
private final List<Integer> index;
private final Figure figure;
}生成棋盘当然是缓慢的(指数渐进的),并且是通过枚举所有可能的板位置来完成的,您可以递归地这样做。
这感觉比List of List of List of etc更优雅。
正如Viliamúr在评论部分中所建议的那样,使用Map数据结构可以只跟踪相关的董事会单元。这种类型的数据结构称为Sparse表示。
发布于 2013-10-23 09:24:13
我不认为这是特别优雅的,但它应该能做到这一点:
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时,向列表中添加8个零;否则,添加8个维度dim-1板。
https://stackoverflow.com/questions/19537621
复制相似问题