连接四个位
Connect Four Bitboard
在这篇文章中,有一个非常有趣的建议,用于测试使用Bitboard的四个胜利。
董事会具有这样的结构:
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片。
现在,我只是在每行迭代,并计算位,但是我敢肯定,使用Shifts必须有更好的方法。
对于第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;
相关文章:
- 找到四个 10 的所有表达式
- 如何在 c++ 中存储具有值的四个参数的元组
- C++ 函数,用于查找数组中四个最小最大元素的总和不起作用
- 如何实现四个 i8 元素组的高效_mm256_madd_epi8点积
- 如何将无符号的 int 值解释为四个字母的单词?
- 使用 QThreadPool 处理多个连接
- 如何让变量随机输出四个单词之一
- 同一提升 TCP 套接字对象上的多个连接
- 如何校准相机焦距,平移和旋转给定四个点
- 这C++ unordered_map怎么有四个值?我以为这是一个键值对
- 我想将四个字节合并为一个数字以进行串行传输
- 多螺纹卷发同时处理多个连接
- ENET:连续有多少个连接可以启用
- QT将MainWindow拆分为四个小部件
- 如何将文本文件的各个部分导入到四个不同的字符串
- Curl - 发送数百个请求,但一次只能发送四个 - 编程
- 如何在GRPC客户端中创建到一个特定地址C++多个连接
- 连接四个C 下降功能无法正常工作
- 连接四个成功的组合检查适用于大多数情况,但不适用于某些情况
- 使用C randint生成四个数字