检查随机二维数组中是否有三连位 Jiǎnchá suíjī èrwéi shùzu zhōng shìfǒu yǒu sānlián wèi

2024-06-16 13:51:30 发布

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

import pprint, random

pp = pprint.PrettyPrinter(1)
grid = []
for x in range(6):
    orbs = [0, 1, 2, 3, 4, 5]
    random.shuffle(orbs)
    y_list = []
    for y in range(5):
        y_list.append(orbs[y])
    grid.append(y_list)

pp.pprint(grid)

好的,我已经写出了上面的代码来打印一个6(R)x5(C)矩阵的2d数组。板上的每个坐标应该在每个循环上随机生成,这就是我想要的。在

现在,我在思考如何检查三排匹配(仅限于垂直或水平)时遇到了麻烦,这样的随机板永远不会出现这种情况。在

我应该先创建电路板,然后检查条件(一行3个)吗?还是应该在生成行/列时将条件编码到每一行/列?有没有一个python模块我应该看看,它已经按照这些思路做了一些事情?在

编辑:

以下是一个不可接受的输出示例:

^{pr2}$

这里有一个可以接受的:

[[4, 1, 4, 4, 5],
 [1, 3, 0, 1, 4],
 [1, 5, 4, 4, 0],
 [5, 2, 0, 4, 3],
 [5, 4, 2, 1, 0],
 [0, 1, 5, 0, 4]]

Tags: 代码inimportforprettyprinterrangerandom条件
3条回答
def validate(board):
    Hdiff = np.abs(np.diff(board))
    Vdiff = np.abs(np.diff(board.T))
    kernel = np.ones((1,2))
    test = convolve2d(Hdiff, kernel, 'valid')
    test2 = convolve2d(Vdiff, kernel, 'valid')
    x1,y1 =  np.nonzero(test == 0)
    y2,x2 =  np.nonzero(test2 == 0)

    if len(x1):
        board[x1,y1] = np.random.randint(0, 5, len(x1))
    if len(x2):
        board[x2,y2] = np.random.randint(0, 5, len(x2))

    if len(x1) or len(x2):
        return validate(board)
    else:
        return board

myBoard = np.random.randint(0, 5, (6, 5))
myBoard[1,2:5] = [3, 3, 3]
myBoard[0:3, 0] = [1, 1, 1]
print myBoard
print validate(myBoard)

原件:

^{pr2}$

已验证:

^{3}$

使用卷积来检测无效的行\列。在

Should I create the board first, then check for a condition (3-in-a-row) first?

是的,听起来是最简单的方法!在

Or should I be coding in the condition to each row\column as they are generated?

我不会的!那就更复杂了。=)

在纽比

> a = np.array(
[[5, 2, 5, 2, 2],
 [5, 4, 1, 5, 2],
 [1, 1, 0, 5, 3],
 [4, 4, 4, 0, 1],
 [0, 5, 0, 0, 3],
 [5, 3, 4, 2, 5]])
> (a[:,:-2:] == a[:,1:-1:]) & (a[:,:-2:] == a[:,2::]) # start of horizontal runs
array([[False, False, False],
       [False, False, False],
       [False, False, False],
       [ True, False, False],
       [False, False, False],
       [False, False, False]], dtype=bool)
> (a[:-2:,:] == a[1:-1:,:]) & (a[:-2:,:] == a[2::,:]) # start of vertical runs
> (a[:-2:,:-2:] == a[1:-1:,1:-1:]) & (a[:-2:,:-2:] == a[2::,2::]) # start of diagonal runs

您可以使用numpy.where(a[:,:-2:] == a[:,1:-1:]) & (a[:,:-2:] == a[:,2::])来获取运行开始的坐标。在

相关问题 更多 >