【问题标题】:checking diagonals in 2d list (Python)检查二维列表中的对角线(Python)
【发布时间】:2013-02-26 22:34:31
【问题描述】:

最初的问题:对于给定的 3x3 井字棋棋盘,检查是否有玩家获胜。

到目前为止,我提出的最简单的解决方案是旋转矩阵并对每一行求和:

board
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]

pr(board)
0 1 2
3 4 5
6 7 8

pr(zip(*board))
0 3 6
1 4 7
2 5 8

上面的0..9数字只是为了显示棋盘上的位置,通常他们会为玩家1填充1,为玩家2填充-1,为未填充位置填充0。逐行进行,如果总和为 3 或 -3,则为获胜块。

但是,不检查对角线。有没有办法以优雅+高性能的方式从这样的矩阵中提取对角线?我的意思不是“手动”使用琐碎的索引 (0, 1, 2),而是获取 n x n 矩阵的对角线。

附: pr 只是打印二维列表的辅助函数:

def pr(x):
    for row in x:
        print ' '.join(map(str, row))

【问题讨论】:

  • pr 函数是什么?
  • 辅助函数,见 P.S.在我现在编辑之后

标签: python 2d


【解决方案1】:

你可以得到一个对角线:

[r[i] for i, r in enumerate(board)]
# [0, 4, 8]

而对角线为:

[r[-i-1] for i, r in enumerate(board)]
# [2, 4, 6]

【讨论】:

  • 你可以把-i-1变成~i
  • 优雅的解决方案!
【解决方案2】:

用魔方编号你的游戏场

2|9|4
7|5|3
6|1|8

现在在三步之后求和,并检查总和是否为 15 --> 获胜者。您必须为每个玩家检查这一点。当然你必须在第 4 步和第 5 步后重新检查(仅限开始游戏的玩家)

这就是我在我的第一个 Java 课程中解决这个问题的方法。

【讨论】:

  • 虽然不是直接的答案,但这是最有创意的解决方案
【解决方案3】:

你需要的可能在numpy,见Get all the diagonals in a matrix/list of lists in Python。也许你可以使用它,并像你一样翻转它以获得其他解决方案。

if sum(board[i][i] for i in (0, 1, 2)) in (-3, 3):
    true

【讨论】:

    【解决方案4】:

    方板上的对角线位于索引相等的位置,因此对于 3x3 板,它们是 board[0][0]board[1][1]board[2][2] 或两者之和等于棋盘大小 1(在这种情况下为 3 个位置):例如 board[0][2]board[1][1]board[2][0] - 请注意 @ 987654327@ 应该包含在这两个集合中。这些事实使得编写 Python 代码来计算它们变得相当容易:

    board = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
    BOARD_SIZE = len(board)
    
    diags1 = [board[i][i] for i in xrange(BOARD_SIZE)]
    diags2 = [board[i][BOARD_SIZE-1-i] for i in xrange(BOARD_SIZE)]
    
    print diags1
    print diags2
    

    输出:

    [0, 4, 8]
    [2, 4, 6]
    

    【讨论】:

      【解决方案5】:

      这将为您提供一个列表,其中包含一个方向的对角线元素(从左上到右下):

      [board[i][i] for i in range(len(board))]
      

      这将对相反的方向做同样的事情:

      [board[i][len(board)-i-1] for i in range(len(board))]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 2020-06-13
        • 1970-01-01
        • 2021-02-17
        • 2021-12-11
        • 2016-07-23
        • 1970-01-01
        • 2020-01-18
        相关资源
        最近更新 更多