检查二维列表的对角线(Python)

4 投票
6 回答
12901 浏览
提问于 2025-04-17 17:14

最初的问题是:给定一个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,用-1表示玩家2,用0表示未填的位置。我们逐行检查,如果某一行的和是3或-3,那就是获胜的标志。

不过,这样做没有检查对角线。有没有什么优雅又高效的方法可以从这样的矩阵中提取对角线?我不是说用简单的索引“手动”去找(比如0, 1, 2),而是想要一种可以获取n x n矩阵对角线的方法。

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

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

6 个回答

2

你可能需要用到 numpy 这个库,具体可以参考这个链接:在Python中获取矩阵/列表的所有对角线。也许你可以用这个方法,然后像之前那样进行翻转,得到另一个解决方案。

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

你可以用下面的代码获取一条对角线:

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

而要获取另一条对角线,可以使用下面的代码:

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

给你的游戏区域编号,使用魔方阵的方式

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

现在在进行三次移动后,计算一下所有编号的总和,看看是不是15 --> 如果是,那就是赢家。你需要对每个玩家都进行这样的检查。当然,在第4次和第5次移动后,也要重新检查一下(只有开始游戏的那个玩家需要检查)。

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

撰写回答