算法检查连接四个字段

时间:2011-08-11 21:35:10

标签: algorithm

我想知道在连接四领域检查获胜者的最佳方法是什么。

我对你们的想法感兴趣,是否对这类问题有一些“众所周知的”算法?

解决方案:

我用Python实现了Ardavan的哈希表解决方案。

我让算法在每个字段上运行一次。我的实现的最佳检查时间是0.047毫秒,最差的0.154毫秒和我的英特尔(R)酷睿2双核CPU T9600 @ 2.80GHz上的平均0.114毫秒。这足以满足我的需求,算法看起来很整洁。

3 个答案:

答案 0 :(得分:26)

来自John Tromp的Fhourstones Benchmark的源代码使用了一种迷人的算法来测试连接四游戏以获得胜利。该算法使用以下bitboard表示游戏:

.  .  .  .  .  .  .  TOP
5 12 19 26 33 40 47
4 11 18 25 32 39 46
3 10 17 24 31 38 45
2  9 16 23 30 37 44
1  8 15 22 29 36 43
0  7 14 21 28 35 42  BOTTOM

红色播放器有一个位板,黄色播放器有一个位板。 0表示空单元格,1表示已填充的单元格。位板存储在无符号的64位整数变量中。比特6,13,20,27,34,41,> = 48必须是0

算法是:

// return whether 'board' includes a win
bool haswon(unsigned __int64 board)
{
    unsigned __int64 y = board & (board >> 6);
    if (y & (y >> 2 * 6))     // check \ diagonal
        return true;
    y = board & (board >> 7);
    if (y & (y >> 2 * 7))     // check horizontal
        return true;
    y = board & (board >> 8);
    if (y & (y >> 2 * 8))     // check / diagonal
        return true;
    y = board & (board >> 1);
    if (y & (y >> 2))         // check vertical
        return true;
    return false;
}

您必须为执行最后一步的玩家的位板调用该功能。 我尝试在我的answer to the question "How to determine game end, in tic-tac-toe?"中解释算法。

答案 1 :(得分:7)

每个单元格最多只能归类为12个获胜组合。 (4水平,4垂直和4对角线)。每个组合将有4个单元,包括正在考虑的单元。对于靠近两侧的细胞来说,这些数字会更低。因此,预编译这些组合并存储相关单元格的哈希散列是有意义的,这可以使单个游戏成为赢家。这样,在每个单元格为玩家之后,您只需拉出相关的组合/单元格以检查它是否是赢家。

答案 2 :(得分:1)

这与此问题有关:How to find the winner of a tic-tac-toe game of any size?

扭曲是7x6板,连续4个获胜,而不是连续N赢得的NxN板。但是,使解决方案适应NxN tic tac toe以连接4是微不足道的。

编辑:实际上,让其他解决方案适应这个问题并不是一件容易的事。但是你可以通过一些额外的工作来实现目标。

为每个玩家存储每个玩家的计数,每行,列,对角线和反对角线可以连续4件。当任一玩家的计数达到4或更多时,检查该行/列/对角线/反对角线是否连续有四个部分。如果是的话,该玩家获胜!