python 求小岛面积

【问题描述】

用一个二维方阵(最小为3X3,最大为9X9)表示一片海域。方阵中的元素只由0和1组成。1表示海岸线。计算由海岸线围起来的小岛面积(即:由1围起来的区域中0的个数)。如下图所示6X6方阵表示的小岛面积为9:
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 1 1
上述方阵表示的海域满足下面两个要求:
1、小岛只有一个。
2、用1表示的海岸线肯定可以封闭成一个小岛,但有可能是凸的,也有可能是凹的。所以在判断时:对于方阵中的任意一个元素0,如果其位于同一行上的两个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 1 1

【输出样例】

9

【样例说明】

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

n = int(input())
sea = []
for r in range(n):
    sea.append(input().split())
# print(sea)

#求出各行的最左边1和最右边1的坐标
row_left_right = []
for r in range(n):
    left_right = [None, None]
    for c in range(n):
        if sea[r][c] == '1':
            if left_right[0] == None:
                left_right[0] = c
            if left_right[1] == None or left_right[1] < c:
                left_right[1] = c
    row_left_right.append(left_right)
# print(row_left_right)
#求出各列的最上方1和最下端1的坐标
column_upper_lower = []
for c in range(n):
    upper_lower = [None, None]
    for r in range(n):
        if sea[r][c] == '1':
            if upper_lower[0] == None:
                upper_lower[0] = r
            if upper_lower[1] == None or upper_lower[1] < r:
                upper_lower[1] = r
    column_upper_lower.append(upper_lower)
# print(column_upper_lower)

def is_land(row, column, row_left_right, column_upper_lower):
    if row_left_right[row][0] == None:
        return False
    if column_upper_lower[column][0] == None:
        return False
    if row_left_right[row][0] < column < row_left_right[row][1] and \
        column_upper_lower[column][0] < row < column_upper_lower[column][1]:
        return True
    else:
        return False

land_area = 0
for r in range(n):
    for c in range(n):
        if sea[r][c] == '0':
            in_land_area = is_land(r, c, row_left_right, column_upper_lower)
            # print(r, c, ":", in_land_area)
            if in_land_area:
                land_area += 1

print(land_area)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值