首页 > 解决方案 > Tilemap 数组:查找唯一的连续元素

问题描述

想象一下,您正在为当地政府工作,担任土地测量员。您的工作是找出该市当前工业用地上还有多少空间可用于新建筑。为此,您需要测量今天有多少建筑物。工业用地由二维数组表示,其中“B”表示建筑物(部分),“E”表示空白空间。如果 B 与其他 B 水平或垂直连接,则这些 B 是一栋建筑物的一部分。如果两个 B 只对角连接,则将它们视为独立的建筑物。编写一个函数:find_building(input_map),它返回工业场地上的建筑物数量。如果数组中的任何元素不是“B”或“E”,则该函数应返回 -1。笔记:编辑器中的初始代码使用制表符进行缩进。不要将其与空格混合。示例:以下示例中有三座建筑物:

[
  ["B", "B", "B"],
  ["B", "E", "B"], 
  ["E", "E", "E"], 
  ["E", "E", "B"], 
  ["B", "E", "B"]
]
def func(test):
    print(test)
    count = 1
    for i in range(len(test)):
        for j, data in enumerate(test[i]):
            if data == "B" or data == "N": 
                if data == "B":
                    arr[i][j] = count;
                    count = count + 1
                if (j + 1) < len(arr[i]):
                    if arr[i][j+1] == "B" :
                        arr[i][j+1] = "N"
                if (i+1) < len(test):
                    if arr[i+1][j] == "B":
                        arr[i+1][j] = "N"

    return test

我想知道现场有多少建筑物。我找不到如何实现确切的逻辑。 在此处输入图像描述

标签: pythonarrayspython-3.xlistnumpy

解决方案


不漂亮,但它正在工作: https ://trinket.io/python3/c26252b88a

arr = [
  ["B", "B", "B"],
  ["B", "E", "B"], 
  ["E", "E", "E"], 
  ["E", "E", "B"], 
  ["B", "E", "B"]
]


def check_contiguous( idxRow, idxCol):
    arr[idxRow][idxCol] = 'X'
    # bottom left cell
    if idxRow == len(arr)-1 and idxCol == len(arr[0])-1:
        return 0

    # bottom row
    elif idxRow == len(arr)-1:  
        if arr[idxRow][idxCol+1] != 'B':
            return 0
        else:
            if arr[idxRow][idxCol+1] == 'B':
                check_contiguous(idxRow, idxCol+1)
    # right column
    if idxCol == len(arr[0])-1:
        if arr[idxRow+1][idxCol] != 'B':
            return 0
        else:
            if arr[idxRow+1][idxCol] == 'B':
                check_contiguous(idxRow+1, idxCol)
    else:
        if arr[idxRow+1][idxCol+1] != 'B' and \
            arr[idxRow][idxCol+1] != 'B':
            return 0
        else:
            if arr[idxRow+1][idxCol] == 'B':
                check_contiguous(idxRow+1, idxCol)
            if arr[idxRow][idxCol+1] == 'B':
                check_contiguous(idxRow, idxCol+1)

def func():
    total_nb = 0
    for idx_row, row in enumerate(arr):
        for idx_col, el in enumerate(row):
            if el == 'B':
                total_nb += 1
                check_contiguous(idx_row, idx_col)
    return total_nb

print(func())

推荐阅读