使用 Python 语言编程,用一个二维方阵(最小为 3X3,最大为 9X9)表示一片海域。方阵中的元素只由 0 和 1 组成。1 表示海岸线。计算水面面积(即:不在 1 围起来的区域中 0 的个数)。如下图所示 6X6 方阵表示的水面面积为 14:

0 0 0 1 0 0
0 0 1 0 1 0
0 1 0 0 0 1
1 0 0 0 1 0
1 0 1 0 1 0
1 1 0 1 0 0

上述方阵表示的海域满足下面两个要求:

1、小岛只有一个。 2、用 1 表示的海岸线是封闭的,但有可能是凸的,也有可能是凹的。

提示:

对于方阵中的任意一个元素 0,如果其位于同一行上的两个 1 之间,并且位于同一列上的两个 1 之间,则该元素肯定在 1 围起来的区域中。否则就不在 1 围起来的区域中,即属于水面。

【输入形式】

先从标准输入中输入方阵的阶数,然后从下一行开始输入方阵的元素(只会输入 0 或 1),各元素之间以一个空格分隔,每行最后一个元素后没有空格,但会有回车换行符。

【输出形式】

在标准输出上输出用整数表示的水面面积。

【输入样例】

6
0 0 0 1 0 0
0 0 1 0 1 0
0 1 0 0 0 1
1 0 0 0 1 0
1 0 1 0 1 0
1 1 0 1 0 0

【输出样例】

14

【样例说明】

输入是 6X6 的方阵。该方阵中不在 1 围起来的区域中 0 的个数为 14,所以输出的小岛面积为 14。注意:最下方的三个元素 1(即第 5 行第 3 列的 1、第 6 行第 2 列的 1、第 6 行第 4 列的 1)组成了一个凹形的海岸线,第 6 行第 3 列的 0 不在海岸线内,所以应算作水面面积。

给出具体代码内容:

n = int(input())
arr = []
for i in range(n):
    line = input().split()
    arr.append([int(x) for x in line])

# 找到左边第一个 1
def find_left(i, j):
    while j > 0 and arr[i][j-1] == 1:
        j -= 1
    return j

# 找到右边第一个 1
def find_right(i, j):
    while j < n-1 and arr[i][j+1] == 1:
        j += 1
    return j

# 找到上边第一个 1
def find_top(i, j):
    while i > 0 and arr[i-1][j] == 1:
        i -= 1
    return i

# 找到下边第一个 1
def find_bottom(i, j):
    while i < n-1 and arr[i+1][j] == 1:
        i += 1
    return i

# 计算水面面积
def count_water_area():
    water_area = 0
    for i in range(n):
        for j in range(n):
            if arr[i][j] == 0:
                # 判断该点是否在 1 围起来的区域中
                left = find_left(i, j)
                right = find_right(i, j)
                top = find_top(i, j)
                bottom = find_bottom(i, j)
                if left < right and top < bottom:
                    flag = True
                    for k in range(top, bottom+1):
                        if arr[k][left] == 0 or arr[k][right] == 0:
                            flag = False
                            break
                    for k in range(left, right+1):
                        if arr[top][k] == 0 or arr[bottom][k] == 0:
                            flag = False
                            break
                    if flag:
                        water_area += 1
    return water_area

water_area = count_water_area()
print(water_area)
Python 编程:计算海域水面面积

原文地址: https://www.cveoy.top/t/topic/oB2p 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录