我目前正在为可以放置棋子的国际象棋变体引擎调试我的转置表(即最初不在棋盘上)。我需要知道我多久遇到一次关键冲突。我将片段列表与通常的哈希数据一起保存在每个表索引中。我确定两个位置是否相等的简单解决方案是在换位上失败,因为我在线性比较两个列表。
请不要建议我应该以 board-centric 而不是 piece-centric 来存储。由于可放置和捕获的作品的独特性,我必须存储作品清单。这些状态中的碎片就像它们占据了重叠且无位置的位置。请查看有关如何存储碎片的说明。
// [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;
}
性能/内存是一个考虑因素,因为该表每轮获得超过 10 万次点击(其中键相等),并且典型的表有 100 万个项目。从今以后,我正在寻找比复制和排序列表更快的东西。