使用 Python 检查二进制矩阵中的水平和垂直对称性

pythonserver side programmingprogramming更新于 2023/12/29 1:59:00

二进制矩阵是一个矩形网格,其中每个元素为 0 或 1,表示真或假状态。它被广泛用于表示各个学科之间的关系、连接性和模式

假设我们采用一个包含 N 行和 M 列的2D二进制输入矩阵。 T. 现在我们将使用以下方法检查输入矩阵是水平对称还是垂直对称或两者兼而有之。

如果第一行与最后一行匹配,第二行与倒数第二行匹配,依此类推,则称该矩阵为水平对称。

如果第一列与最后一列匹配,第二列与倒数第二列匹配,依此类推,则称该矩阵为垂直对称。

示例

1 0 1
0 1 0
1 0 1

水平对称:当矩阵水平翻转时,第一行"1 0 1"是第三行"1 0 1"的精确镜像。第一行中的每个元素都与第三行中相同位置的元素相对应。

垂直对称:当矩阵垂直翻转时,第一列"1 0 1"是第三列"1 0 1"的镜像版本。第一列中的元素与第三列中相同位置的元素对齐。

算法(步骤)

以下是执行所需任务所要遵循的算法/步骤 –。

  • 创建一个函数 checkHorizo​​ntalVertical(),通过传递输入矩阵、行数和列数作为参数来检查输入矩阵是水平对称还是垂直对称。

  • 将 Horizo​​ntal_symmetric 和 Vertical_symmetric 初始化为 True,以假设矩阵在两个方向上都是对称的。

  • 将第一行与最后一行、第二行与倒数第二行进行比较,以检查水平对称性。

  • 遍历矩阵的一半行。

  • 在循环内部,遍历列并将当前行的每个单元格与正在比较的行中的相应单元格进行比较。

  • 如果任何单元格不同,则将 Horizo​​ntal_symmetric 设置为 False 并中断循环。

  • 在下一次迭代中,将行号增加 1,并将最后一行的行号减少 1。

  • 接下来,通过比较第一列与最后一列、第二列与倒数第二列等来检查垂直对称性。

  • 遍历矩阵的一半列。

  • 在循环内部,遍历行并将当前列的每个单元格与被比较列中的相应单元格进行比较。

  • 如果任何单元格不同,则将 vertical_symmetric 设置为 False 并中断循环。

  • 在下一次迭代中,将列号增加 1,并将最后一列的列号减少 1。

  • 检查对称条件:

    • 如果 Horizo​​ntal_symmetric 和 Vertical_symmetric 都不为 True,则打印"既不水平也不垂直对称。"

    • 如果 Horizo​​ntal_symmetric 为 True 但 Vertical_symmetric 为 False,则打印"输入矩阵是水平对称的。"

    • 如果 Vertical_symmetric 为 True 但 Horizo​​ntal_symmetric 为 False,则打印"输入矩阵是垂直对称的。"

    • 如果 Horizo​​ntal_symmetric 和 Vertical_symmetric 均为 True,则打印"输入矩阵既是水平对称的又是垂直对称的对称。"

  • 使用 inputMatrix、行数和列数作为参数调用 checkHorizo​​ntalVertical 函数。

示例

下面给出的示例将行与其从末尾开始的对应行进行比较以检查水平对称性,将列与其从末尾开始的对应列进行比较以检查垂直对称性。根据比较结果,它会打印输入矩阵是水平对称、垂直对称、水平和垂直对称还是既不水平也不垂直对称。

# 创建一个函数来检查输入矩阵是否
# 水平或垂直对称,方法是传递输入矩阵、
# 行数和列数作为参数
def checkHorizontalVertical(inputMatrix, rows, cols):

    # 首先将水平和垂直
    # symmetric 初始化为 True
    Horizo​​ntal_symmetric = True
    Vertical_symmetric = True
    
    # 我们将第一行与最后一行进行比较,将第二行与第二行
    # 最后一行进行比较,依此类推。
    p = 0
    x = rows - 1
    # 遍历矩阵的一半行
    while p < rows // 2:

        # 遍历列
        for q in range(cols):
            # 检查每个单元格是否相同
            if inputMatrix[p][q] != inputMatrix[x][q]:
                # 如果不相同,则水平对称为假
                horizontal_symmetric = False
                break
                # 将行号增加 1
        p += 1
        x -= 1

    # 检查垂直对称性。将第一列与最后一列进行比较,
    # 将第二列与倒数第二列进行比较,依此类推。
    p = 0
    x = cols - 1
    # 遍历到一半的列
    while p < cols // 2:

        # 检查列的每一行
        for q in range(rows):

            # 检查每个单元格是否相同
            if inputMatrix[p][q] != inputMatrix[x][q]:
                # 如果不相同,则垂直对称为假
                vertical = False
                break
                # 将列号增加 1
        p += 1
        x -= 1

    # 检查是否非水平且非垂直对称
    if not Horizo​​ntal_symmetric and not Vertical_symmetric:
        # 如果条件为真,则打印非水平或垂直对称
        print("非水平或垂直对称")
        # 检查矩阵是否水平对称但非垂直
    elif Horizo​​ntal_symmetric and not Vertical_symmetric:
        # 打印水平对称矩阵
        print("输入矩阵是水平对称的")
        # 检查矩阵是否垂直对称但非水平
    elif Vertical_symmetric and not Horizo​​ntal_symmetric:
        # 打印垂直对称
        print("输入矩阵是垂直对称的")
    else:
        # 否则打印水平和垂直对称
        print("输入矩阵是水平和垂直对称的")


# 输入矩阵
inputMatrix = [[1, 0, 1], [0, 0, 0], [1, 0, 1]]

# 通过将
# 输入矩阵、行数、列数作为参数来调用上述 checkHorizo​​ntalVertical()
checkHorizo​​ntalVertical(inputMatrix, 3, 3)

输出

输入矩阵是水平和垂直对称的

结论

我们在本文中介绍了如何使用嵌套 for 循环遍历矩阵以及如何使用 for 循环遍历每列的行。最后,我们学习了如何确定特定矩阵是水平对称还是垂直对称。


相关文章