五子棋获胜攻略 | 豆包MarsCode AI刷题

1 阅读2分钟

这个问题就像是在玩一个寻找五子棋连线的小游戏。我们的目标是找出在棋盘上放一个棋子后,能够形成五个连续棋子的点。这里有几个步骤可以帮助我们找到这些点:

  1. 检查水平和垂直线

    • 首先,我们要检查棋盘上的每一行和每一列。对于每一行和每一列,我们都要看看有没有四个连续的棋子,如果有,那么在这四个棋子的两端再放一个棋子就能形成五子连线。
  2. 检查对角线

    • 除了水平和垂直线,我们还要检查棋盘上的两条主对角线(从左上到右下和从右上到左下)。方法和检查水平线和垂直线类似,只是方向不同。
  3. 寻找四个棋子的组合

    • 在每一行、每一列和对角线上,我们要找到所有四个连续棋子的组合。这些组合是形成五子连线的关键。
  4. 确定可以放棋子的位置

    • 对于每个四个棋子的组合,我们要检查在这两个棋子的两端是否可以放棋子形成五子连线。如果可以,就把这个位置记下来。
  5. 输出结果

    • 最后,我们将所有可以放棋子形成五子连线的位置整理成一个列表,这就是我们的答案。

举个例子,就像样例1中,我们可以看到棋盘中间有四个连续的棋子,如果我们在第一个和最后一个棋子的位置再放一个棋子,就能形成五子连线,所以输出是[[1, 1], [6, 6]]。

这个问题的难点在于要检查所有的行、列和对角线,而且要考虑到棋盘的大小是未知的,所以我们需要编写一个能够适应不同大小棋盘的算法。但是,通过上面这些步骤,我们可以系统地找到所有可能的位置,而不需要一个一个去试,这样就能提高效率。

def solution(n, array):

    directions = [(0, 1), (1, 0), (1, 1), (1, -1)]
    winning_moves = []
    for i in range(n):
        for j in range(n):
            if array[i][j] == 0:  # 如果当前点是空位
                for dx, dy in directions:
                    count = 1  # 当前空位算作一个
                    # 正方向
                    x, y = i + dx, j + dy
                    while 0 <= x < n and 0 <= y < n and array[x][y] == 1:
                        count += 1
                        x += dx
                        y += dy
                    # 反方向
                    x, y = i - dx, j - dy
                    while 0 <= x < n and 0 <= y < n and array[x][y] == 1:
                        count += 1
                        x -= dx
                        y -= dy
                    # 如果形成了五子连线
                    if count >= 5:
                        winning_moves.append([i + 1, j + 1])  # 转为1-based索引

    return winning_moves



if __name__ == "__main__":
    # Add your test cases here
    array = [
        [0, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0],
        [0, 0, 0, 1, 0, 0],
        [0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 0],
    ]

    print(solution(6, array) == [[1, 1], [6, 6]])