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不在海岸线内,所以不应算作小岛面积。

 

参考代码:


"""
Created on Wed Oct 27 13:46:42 2018

@author: Dina
"""

N = int(input())
squareList = []
for i in range(N):     
    temp = list(map(int,input().split()))  # 把读入的 0和1 都转换为 int 类型
    squareList.append(temp) # 把每一行输入的添加到
count = 0
for i in range(N):    
    for j in range(1,N):
        flg1,flg2,flg3,flg4 = 0,0,0,0
        if squareList[i][j] == 0 :                  
            # 查找一下 某个 0 的左方(同一行上的左方)是否有一个 1
            for m in range(j):
                if squareList[i][m] == 1:
                    flg1 = 1
                    break
             # 查找一下 某个 0 的右方(同一行上的右方)是否有一个 1
            for m in range(j+1,N):
                if squareList[i][m] == 1:
                    flg2 = 1
                    break
             # 查找一下 某个 0 的上方(同一列上的上方)是否有一个 1
            for n in range(i):
                if squareList[n][j] == 1:
                    flg3 = 1
                    break
            # 查找一下 某个 0 的下方(同一列上的下方)是否有一个 1
            for n in range(i+1,N):
                if squareList[n][j] == 1:
                    flg4 = 1
                    break
        # 若某个 0 的 左正方,右正方,上正方,下正方,都有 1 的话,那么面积就加一
        if flg1 == 1 and flg2 == 1 and flg3 == 1 and flg4 == 1 :
            count += 1
print(count)

提交可通过:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值