如何在 2D 列表中对角线检查特定值(如果高度和宽度可能不同)



我正在编写一个像井字游戏这样的程序。

解释

我想做一个函数,将输入作为 n x m 长度的 2D 列表,其中 n 可能等于也可能不等于m

它必须检查2D 列表中的任何地方是否有 4 个连续的 X 或 4 个连续的 O。

如果列表中任意位置有四个相邻的"X"值(行、列、对角线),则应返回"X"。如果列表中的任意位置有四个相邻的"O"值(行、列、 对角线)。如果"X"和"O"都不满足上述条件,则应返回 None。您可能会认为可能只有一个答案。

如果我给出以下输入

xwins = [[None, None, None, None, None, None, None],
[None, None, None, None, None, None, None],
[None, None, None, None, "X" , None, None],
[None, None, None, "X" , "O" , "O", None],
[None, "O" , "X" , "X" , "O" , "X", None],
["O" , "X" , "O" , "O" , "O" , "X" , "X"]]
owins = [[None, None, None, None, None, None, None],
[None, None, None, None, None, None, None],
["O" , "O" , "O" , "O" , None, None, None],
["O" , "X" , "X" , "X" , None, None, None],
["X" , "X" , "X" , "O" , "X" , None, None],
["X" , "O" , "O" , "X" , "O" , None, None]]
nowins =[["X" , "X" , None, None, None, None, None],
["O" , "O" , None, None, None, None, None],
["O" , "X" , "O" , "O" , None, "O" , "O" ],
["O" , "X" , "X" , "X" , None, "X" , "X" ],
["X" , "X" , "X" , "O" , "X" , "X" , "O" ],
["X" , "O" , "O" , "X" , "O" , "X" , "O" ]]
print(myfunc(xwins))
print(myfunc(owins))
print(myfunc(nowins))

它应该给出结果

X
O
None

我的进度

我只找到了一种使用代码检查每一行的方法:

def myfunc(lol):
for i in lol:#lol is list of list :)
string="".join(i)
if ("XXXX" in string):
return "X"
elif ("OOOO" in string):
return "O"

我试图没有麻木。

帮助将不胜感激。对不起,如果我留下了什么不清楚的地方。请在评论中问我。:)

您可以在列中对解决方案使用类似的东西:

vert = ["" for i in range(len(lol[0]))]
for i in range(len(lol)):
for j in range(len(lol[i])):
vert[j] += str(lol[i][j])
for column in vert:
if ("XXXX" in column):
print("X")
elif ("OOOO" in column):
print("O")

它使用列中的元素创建,并检查是否存在所需的模式。

最简单的算法是通过迭代来简单地检查每个方向。

你特别问了对角线。我们必须索引,一个在 x 方向(内部列表),一个在 y 方向(输出列表),我们称它们为iijj.

最简单的对角线是中间的对角线。当你ii == jj时,你在这个对角线上.平行于该的对角线呢?ii + 1 == jjii - 1 == jj.

对于给定的对角线,对于定义要定义的对角线的整数,ii + a == jj为真。

然后类似的论点适用于从另一侧开始的对角线ii + a = n - jj

不确定这是否是最优雅的解决方案,但我像这样使用 Numpy:

首先,将矩阵转换为numpy.array

lol = np.array(lol)

获取维度

rows, cols = lol.shape

通过像这样遍历行和列来检查它们

for i in range(rows):
if "'X' 'X' 'X' 'X'" in np.array_str(lol[:, i]):
return 'X'
...and so on

您可以使用 np.diagonal 函数遍历对角线:

for i in range(rows):
if "'X' 'X' 'X' 'X'" in np.array_str(np.diagonal(lol, offset=i)):
return 'X'
...and so on

您可以通过以下方式获取不同方向的对角线offset=-i.然后,您可以对转置执行相同的操作,这是您获得的np.fliplr(lol).您还可以计算偏移的限制,因为您不需要计算短于 4 的对角线。

相关内容

最新更新