蓝桥杯寒假集训第三天《灌溉》

博客内容讲述了如何解决一个关于长方形区域内水管灌溉问题的算法。作者首先尝试了一种方法,但发现无法处理多个水管同时扩散的情况。然后,采用了暴力法,通过复制数组并在两个循环中更新灌溉状态,最终在给定时间内计算出被灌溉的正方形数量。代码实现中,作者特别注意了避免数组共享导致的错误,并给出了正确的代码实现。此外,还分享了《晚熟的人》中的一句话,鼓励努力进取。
摘要由CSDN通过智能技术生成

没有白走的路,每一步都算数🎈🎈🎈

题目描述:

一个长方形块,在方形块的中间位置有给定的水管,这些水管在单位时间会往上下左右四个方向进行灌溉。问在给定的方块中,一定时间后,给定的方块中的水管会灌溉多少块小正方形。其中原本放有水管的位置就已经被灌溉。

输入描述:

第一行:

输入长方形的长度和宽度n,m

第二行:

输入方形区域内中水管的个数k

接下来k行:

输入每个水管在方形区域内的位置x,y

最后一行:

输入进行灌溉的时间t

输出描述:

输出最后被灌溉的正方形的个数

样例输入输出:

样例输入:

3 6

2

2 2 

3 4

1

样例输出:

9

第一次:

第一次尝试,出现错误。没能考虑两个点是一起扩散的,单独的for循环不能满足条件。只能考虑到一种条件,遂改变想法

第二次:

考虑到这个可以使用暴力法来解,于是这里还没考虑到空间的原因,于是,采用扩大两倍循环,设置两个维数一样的二维数组。

设计思路:

那么我们for循环两次,第一次把一个数组的灌溉的位置抽象成数字1,第二次再把改变的数组全部赋给原来的数组,这样就能达到预期结果

AC代码:

#灌溉
n,m = map(int,input().split())

L = [[0 for j in range(m)]for i in range(n)]
A = [[0 for j in range(m)]for i in range(n)]
k = int(input())
##print(A)
for i in range(k):
    a,b = map(int,input().split())
    L[a-1][b-1] = 1
    A[a-1][b-1] = 1
##print(A)
##def fun(L):
##    l = [[0 for j in range(len(L[0]))]for i in range(len(L))]
##    return l

t = int(input())
for x in range(2*t):
    if x%2==0:
        for i in range(n):
            for j in range(m):
                if L[i][j]==1:
                    if j+1<m:
                        A[i][j+1] = 1
                    if j-1>=0:                      
                        A[i][j-1] = 1
                    if i-1>=0:
                        A[i-1][j] = 1
                    if i+1<n:
                        A[i+1][j] = 1
                    break
    else:
        for i in range(n):
            for j in range(m):
                L[i][j]=A[i][j]

##A = fun(L)
##print(A)
count = 0
##print(L)
##print(A)
for i in range(n):
    for j in range(m):
        if L[i][j]==1:
            count+=1
print(count)

 小彩蛋:

如果你想确保两个数组只是开始的那一刻赋值相同,当其中一个变化,另外一个不受影响的两个数组,就切记不要采用下述的代码

计算出来,在后面对A数组的值进行变更的时候,L数组的值也会变更。

如下所示:(错误示范❌)

 

 正确示范:

代码:


 结果:

每日一句

摘自《《晚熟的人》》:

假如你不努力,一年后你还是原来的你,只是一岁。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li&&Tao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值