检查二维列表的对角线(Python)
最初的问题是:给定一个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课上解决这个问题的方法。