【问题标题】:Is there a way to detect squares drawn by characters in a two-dimensional array?有没有办法检测二维数组中的字符绘制的正方形?
【发布时间】:2022-01-12 18:30:55
【问题描述】:

我有一个 Python 项目,其中有一个 5x4 二维列表,其中包含空字符串作为元素。这些“槽”稍后会根据用户输入填充“A”或“B”。在用 A 或 B 更改所有元素之后,我想在有 20 个输入后找出仅由 A 和 B(如果它们完全形成)组成的 2x2 正方形。 【如果出现这样的阵型,应该算两个方阵。】

我无法解决这个问题。因此,我们将不胜感激。

(我不能使用任何类型的第三方库。但是任何内置的 Python 库都可以。)

【问题讨论】:

  • 到目前为止你有没有尝试过?也许首先编写一些代码来检测每行中的重复字符,然后看看如何扩展它以查看它们是否是正方形的一部分?
  • 嗯,有 20 个 1x1 的正方形,对吧?那不是问题。您已经突出显示了一个矩形。你想要正方形还是长方形?您只需逐个元素地手工完成。搜索 4x4 正方形(只有两种可能),然后搜索 3x3 正方形,然后搜索 2x2。
  • 嗨,我想要由 4 个 A 或 4 个 B 组成的正方形。
  • meta.stackoverflow.com/questions/334822/… .. 如果您在某种网格中只有四个值,您能判断它们是否都相同吗?
  • 欢迎来到 SO!你试过什么了?我们在这里更多地帮助解决“我尝试了 X,但它没有达到我的预期,而是导致错误!”形式的特定问题。伴随着Minimal, Complete, and Verifiable example

标签: python arrays


【解决方案1】:

一个 2x2 的正方形只包含一个值。因此,如果您形成这 4 个元素的集合,则该集合的长度为 1。这很容易实现:

def count_squares(mat):
    m = len(mat) #number of rows
    n = len(mat[0]) #number of columns
    count = 0
    for i in range(m-1):
        for j in range(n-1):
            if len(set([mat[i][j],mat[i][j+1],mat[i+1][j],mat[i+1][j+1]])) == 1:
                count += 1
    return count

mat = [['A','A','A','B','B'],
       ['A','A','B','A','A'],
       ['A','A','B','B','A'],
       ['B','A','A','B','A']]

print(count_squares(mat)) #prints 2

【讨论】:

    【解决方案2】:

    这是您的代码:

    import numpy
    
    def main(l1, l2, A, B, input_list):
        check = numpy.ones((l1, l2)) * A
        pos = []
        for j1 in range(len(input_list) - l1 + 1):
            for j2 in range(len(input_list[0]) - l2 + 1):
                if input_list[j1:j1+l1, j2:j2+l2].all() == check.all():
                    pos.append([j1, j2])
        return pos
    
    if __name__ == "__main__":
        A = 1  # Value of A
        B = 0  # Value of B
        l1 = 2  # Horizontal size of A values searched
        l2 = 2  # Vertical size of A values searched
        input_list = numpy.array([  # User input
            [A, A, A, B, B],
            [A, A, B, A, B],
            [A, A, B, B, A],
            [B, A, A, B, A],
        ])
        
        pos = main(l1, l2, A, B, input_list)
        
        print(f"{input_list = }")
        print(f"{pos = }")
    

    结果:

    input_list = array([[1, 1, 1, 0, 0],
           [1, 1, 0, 1, 0],
           [1, 1, 0, 0, 1],
           [0, 1, 1, 0, 1]])
    pos = [[0, 0], [1, 0]]
    

    输出返回仅包含 1 个值的 2x2 正方形的左上角。在这里你只需要'pos'的len来计算你有多少平方......

    【讨论】:

      猜你喜欢
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      相关资源
      最近更新 更多