360公司 2020秋招 技术综合E卷 在线考试 编程题 第一题 表面积(web前端)

                               360公司 2020秋招 技术综合E卷 在线考试 编程题 第一题 表面积(web前端)_第1张图片

输入:

      第一行包含两个整数N和M, 1<=N, M<=1000。

      接下来N行,每行包含M个整数,第i行的第j个整数表示Aij。

输出:

      输出表面积的大小。

样例输入:

      2 2

      2 1

      1 1

样例输出:

      20

# 思路:每次计算最底下的一层的四周暴露的面数,当某一位置的方块数只有一个的时候,暴露的面数加2,也就是上下两个面。

# 定义存放方块层数的数组
A = []

# 总面积
ans = 0

# 输入矩阵的内容
def input_A():
    N, M = list(map(int, input().strip().split()))
    print("N = {}, M = {}".format(N, M))
    for i in range(N):
        # try:
        A.append(list(map(int, input().strip().split())))
        if len(A[i]) != M:
            print("矩阵A = ",A)
            raise Exception("length error!")          
    return (N, M)
    


# 判断A[i][j]四周有几个暴露面
def areas_exposed(i, j, N, M):
    num = 0  # 一个方块四周暴露出的面数
    for p in [-1, 1]:
        if (p + i) < 0 or (p + i) >= N:  # 判断是否是边缘区域,是则面数加一
            num += 1
        elif A[p + i][j] == 0:  # 判断周围是否有方块,没有则说明暴露出了一个面
            num += 1
        if (p + j) < 0 or (p + j) >= M:  # 判断是否是边缘区域,,是则面数加一
            num += 1
        elif A[i][p + j] == 0:  # 判断周围是否有方块,没有则说明暴露出了一个面
            num += 1
    return num

# 每次判断后去掉最底下一层
def remove(N, M):
    for i in range(N):
            for j in range(M):
                if A[i][j] >= 1:
                    A[i][j] -= 1


def main(ans):
    cube_exist = True  # 标识是否还存在未消去的方块
    N, M = input_A()
    while cube_exist:
        cube_exist = False  # 先置为 0, 当仍然存在方块的时候置为1,以便再次循环
        for i in range(N):
            for j in range(M):
                if A[i][j] == 1:
                    ans += 2  # 顶层和底层共两个面
                    ans += areas_exposed(i, j, N, M)  # 计算四周暴露面数
                elif A[i][j] > 1:
                    cube_exist = True
                    ans += areas_exposed(i, j, N, M)  # 计算四周暴露面数
        remove(N, M)
    print(ans)  # 输出总面积数

main(ans)

暂时只想出了这种解法,若有不足,还望指出,谢谢。

你可能感兴趣的:(笔试算法)