python 解决给定0,1矩阵,求岛的面积问题

给定形如下 的矩阵,
 1 1 1 1 1 1 
 1 1 0 0 0 1 
 1 0 0 0 1 0 
 1 1 0 1 1 1 
 0 1 0 1 0 0 
 1 1 1 1 1 1 
上面矩阵的中的1代表海岸线,0代表小岛。求第二岛的面积(即
被1中包围的0的个数,如果只有一个小岛,输出最大岛的面积)。
注意:
1. 仅求这样的0,该0所在行中被两个1包围,该0所在列中被
两个1包围; 
2. 输入矩阵中包含的小岛K >= 1; 
样例输入 : 
1 1 1 1 1 1 
1 1 0 0 0 1 
1 0 0 0 1 0 
1 1 0 1 1 1 
0 1 0 1 0 0 
1 1 1 1 1 1 
样例输出: 
 8 

 

题目看了很久才看懂(哈哈哈哈哈....)

  然后整体的思路

  1. 将目标中满足条件的小岛的编号由0改为8
  2. 遍历目标,如果为8,运用递归函数计算周围(上下左右8的个数),为了避免 多次计算一个岛群的面积,将该岛群中的岛编号改为1
  3. 最后返回的是一个列表,包含所有岛群的面积.没有就是空列表,有几个岛 群面积返回的列表就包含几个元素

详细的实现过程见代码,可以更改目标,进行测试

'''
整体思路:
    这里将目标放在了一个二维数组中,然后遍历这个数组,将符合条件的小岛的编号设置为8
    计算总面积只需要计算8的个数就行了
    计算每个面积运用递归,计算该小岛与四周的符合条件的小岛的距离,最后返回的是一个列表,里面包含每个小岛的面积

'''


#  首先遍历整个二维数组,将符合条件的小岛设置为8
def target(my_target):
    for i in range(1, 6):
        for j in range(1, 6):
            # 满足是0(小岛)
            if my_target[i][j] == 0:
                # 判断 小岛 左右上下是否都含有1(海岸线)
                my_left = [my_target[i][x] for x in range(j)]
                my_right = [my_target[i][x] for x in range(j + 1, 6)]
                my_top = [my_target[x][j] for x in range(i)]
                my_bottom = [my_target[x][j] for x in range(i + 1, 6)]
                if 1 in my_left and 1 in my_right and 1 in my_top and 1 in my_bottom:
                    my_target[i][j] = 8

# 如果只是计算总小岛的面积的话,只需要计算所有8的个数就可以了
# 这里要计算第二个小岛的面积,我这里不知道第二个小岛是怎么定义的,因此计算出了每个小岛的面积
# 计算小岛的面积,这里为了避免重复计算一个小岛群的面积,将已经计算的面积重新设置为1
# 主要用了递归,计算了该岛群 上下左右符合条件的个数
def area(my_target, i, j):
    if 0 <= i < 6 and 0 <= j < 6 and my_target[i][j] == 8:
        my_target[i][j] = 1
        return 1 + area(my_target,i-1,j)+ area(my_target,i+1,j)+ area(my_target,i,j-1)+ area(my_target,i,j+1)
    else:
        return 0

# 计算每个岛群的面积
def area_list(my_target):
    my_area=[]
    for i in range(1, 6):
        for j in range(1, 6):
            if my_target[i][j] == 8:
                # 将每个岛群的面积放在列表中
                my_area.append(area(my_target, i, j))
    return my_area


if __name__ == '__main__':
    # 随意的二维数组,可以更改进行测试
    my_target = [
        [1, 1, 1, 1, 1, 1],
        [1, 1, 0, 0, 0, 1],
        [1, 0, 0, 0, 1, 0],
        [1, 1, 0, 1, 1, 1],
        [0, 1, 0, 1, 0, 0],
        [1, 1, 1, 1, 1, 1]
    ]
    target(my_target)
    # 最终的岛群的面积放在列表中,有几个岛群列表中有几个元素
    area_list=area_list(my_target)
    print(area_list)

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值