检查2d列表中的对角线(Python)

2024-03-28 13:55:59 发布

您现在位置:Python中文网/ 问答频道 /正文

最初的问题是:对于一个给定的3x3tic-tac-toe板,检查是否有一个玩家赢了。

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

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号玩家的数字是0。一排一排地走,如果加起来是3或-3,这就是获胜的一块。

但是,不检查对角线。有没有什么方法可以用优雅+高效的方式从这样的矩阵中提取对角线?我不是指“手动”使用普通索引(0,1,2),而是得到n x n矩阵的对角线。

p.S.pr只是打印二维列表的辅助函数:

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

Tags: 方法board棋盘方式玩家情况矩阵数字
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

用魔方给你的游戏场编号

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

现在,在三步后进行总结,并检查总和是否为15-->;赢家。你必须为每个玩家检查这个。当然你必须在第四步和第五步后重新检查(只有开始游戏的玩家)

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

你可以得到一个对角线:

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

相反的对角线是:

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

相关问题 更多 >