2022年4月23日第十三届省赛蓝桥杯真题答案_python_第五题_统计未被污染的海域

第五题如约而至哈,和第六题差不多(但比第六题简单)。好!上题目:

题目:

有一片海域划分为N*M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。请问这片N*M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N*M以外的海域都为已被污染的海域)

例如:N=4,M=5,4*5的海域中,已被污染海域和没被污染的海域如下图:

输入描述:

第一行输入两个正整数N和M,N表示矩阵方格的行,M表示矩阵方格的列,N和M之间以一个英文逗号隔开

第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)      

输出描述:

输出一个整数,表示N*M的海域中有几块是没被污染的独立海域

输入样例:

4,5                                                                                                                                                     

1,1,0,0,0                                                                                                                                             

1,0,1,0,0                                                                                                                                             

1,0,0,0,0                                                                                                                                             

1,1,0,1,1

输出样例:3

这题很简单,难就难在你考虑的方向。如果你看一块海。你就上下左右看一圈,看一块海,你就上下左右看一圈。我可以告诉你的是,这样行!但是麻烦死了!因为在拐角处你的电脑会算作这是两块海,有可能一块海还会被算n多次

那么我们怎么思考呢?可以采用一种“污海”的思路:找到一块海,在它的下面一直找,左面一直找,找到一个“污”一个(即把1变成0),这样便能找到全部的未被污染的海域还能既不重复也不遗漏了!有人说那右边的和上边的怎么办,那要怪你没考虑周全,你如果一块海在上边或右边有海,那么在遍历它上面或右边时不早把这块海遍历“污染”了吗?

好,思路就是这样,概括一下就是:一、找左边   二、找下边    三、汇合(拐角成为一块海域)  四、打印

上代码:


def find_right(j,g,M):  # 右边找找(M后期赋值 列的意思)
    global s
    d=0  # 纯净海域数
    while g<M:  # 注意不要超过遍历范围
        if s[j][g]==1:  # 判断是否没被污染
            s[j][g]=0  # 把海污染了
            g+=1  # 往右一块
            d+=1  # 纯净海域数+1
        else:
            break  # 不是就退出
    if d !=0:  # 如果有纯净海域(不管多少,有就行)
        return 1
    else:
        return 0
 
def find_down(j,g,N):  # 下面找找,和右边方法一模一样(N后期赋值 行的意思)
    global s
    d=0
    while j<N:
        if s[j][g]==1:
            s[j][g]=0
            j+=1  # 往下一块
            d+=1
        else:
            break
    if d !=0:
        return 1
    else:
        return 0
n=input()  # 输入行和列
N=int(n[0])  # 行
M=int(n[2])  # 列(去掉逗号 它算第三个)
s=[]  # 总体大地图
z=0  # 纯净海域数(未被加工 拐角处会算两个)
y=0  # 拐角数(把z减掉y就剩下最终结果了)
for i in range(N):  # 搞N个输入框 达到N行的效果
    a=list(eval(input()))  # 把输入结果转成列表
    s.append(a)  # 把a这个小地图放到s这个大地图里
print(s)

for j in range(N):  # 行索引号
    for g in range(M):  # 列索引号
        if s[j][g]==1:  # 开始判断拐角
            if ((j<N-1 and s[j+1][g]==1) or (j>0 and s[j-1][g]==1)) and ((g<M-1 and s[j][g+1]==1) or (g>0 and s[j][g-1]==1)):  
#  既满足下边有或者上边有 还满足 右边有或者左边有 
                y+=1  # 拐角数+1

for j in range(N):
    for g in range(M):
        if s[j][g]==1:
            if g<M-1 and s[j][g+1]==1:  # 如果右边有
                l=find_right(j,g,M)  # 左找找
            elif j<N-1 and s[j+1][g]==1:  # 如果下边有
                e=find_down(j+1,g,N)  # 下找找
            z+=1  # 最终不管结果如何 满足s[j][g]=1的就都应该把纯净海域数+1
print(z-y)  # 打印最终结果

好啦,今天的代码就是这些啦,有需要的尽管拿走,有建议的尽管提,有求必应、有问必答。谢谢几位小伙伴的提醒,欢迎三连(点赞、转发、收藏),嘿嘿!

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值