我正在调试一个棋类变体引擎的转置表,其中棋子可以放置(即原本不在棋盘上)。我需要知道我有多少次键冲突。我在每个表索引中保存棋子列表,以及通常的哈希数据。我的简单解决方案用于确定两个位置是否相等,但由于我正在线性比较两个棋子列表,因此在转置时会失败。
请不要建议我应该按照面向棋盘而不是面向棋子的方式进行存储。由于可放置和被捕获棋子的独特性质,我必须存储棋子列表。这些状态下的棋子就像占据了一个重叠且没有位置的位置。 请查看存储棋子的描述。
// [Piece List]
//
// Contents: The location of the pieces.
// Values 0-63 are board indexes; -2 is dead; -1 is placeable
// Structure: Black pieces are at indexes 0-15
// White pieces are at indexes 16-31
// Within each set of colors the pieces are arranged as following:
// 8 Pawns, 2 Knights, 2 Bishops, 2 Rooks, 1 Queen, 1 King
// Example: piece[15] = 6 means the black king is on board index 6
// piece[29] = -2 means the white rook is dead
char piece[32];
当棋子的顺序发生变化,但最终结果是相同的棋盘位置时,称为移位。例如,以下棋局位置是等价的:
1) first rook on A1; second rook on D7
2) first rook on D7; second rook on A1
以下是一个非优化通用算法;内部循环类似于另一个通用问题,但增加了一个限制条件:0-63范围内的数值只会出现一次(即每个方格仅有一种棋子)。
for each color:
for each piece type:
are all pieces in the same position, disregarding transpositions?
以下比较不起作用,因为存在交换。我需要一种方法来检测交换是否相等,并仅报告实际不同的位置。
bool operator==(const Position &b)
{
for (int i = 0; i < 32; i++)
if (piece[i] != b.piece[i])
return false;
return true;
}
性能/内存是需要考虑的因素,因为该表格每次操作都会有超过100,000个命中(键相等),并且典型的表格包含1百万项。因此,我正在寻找比复制和排序列表更快速的解决方案。