在this帖子中,有一个非常有趣的建议,即使用位板测试连接四胜。
董事会的结构如下:
6 14 22 30 38 46 54
5 13 21 29 37 45 53
4 12 20 28 36 44 52
3 11 19 27 35 43 51
2 10 18 26 34 42 50
1 9 17 25 33 41 49
0 8 16 24 32 40 48
他们还建议使用以下算法,仅使用8个班次测试胜利:
bool haswon(int64_t board)
{
int64_t y = board & (board >> 7);
if (y & (y >> 2 * 7)) // check \ diagonal
return true;
y = board & (board >> 8);
if (y & (y >> 2 * 8)) // check horizontal -
return true;
y = board & (board >> 9);
if (y & (y >> 2 * 9)) // check / diagonal
return true;
y = board & (board >> 1);
if (y & (y >> 2)) // check vertical |
return true;
return false;
}
我想在我写的类似程序中实现这个算法。但是,要应用我的启发式函数,我需要能够知道给定行中有多少个部分。我真的一直试图围绕这个算法,但我无法弄清楚如何检查连续只有1,2或3件。
现在,我只是在每行迭代,并计算位数,但我确信必须有更好的方法来使用移位。
答案 0 :(得分:4)
对于第0行,您可以通过执行以下操作获得件数:
int64_t row0 = board & 0x01010101010101LL;
row0 += row0 >> 32;
row0 += row0 >> 16;
row0 += row0 >> 8;
return row0 & 0xff;
与其他行类似(先按行号移位)。事实上,你可能一次做两行,因为计数总是适合3位。
int64_t x = board & 0x11111111111111LL;
x += x >> 32;
x += x >> 16;
x += x >> 8;
int row0 = x & 0xf;
int row4 = (x >> 4) & 0xf;