小言_互联网的博客

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

342人阅读  评论(0)

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

题目描述:

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

输入描述:

第一行:

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

第二行:

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

接下来k行:

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

最后一行:

输入进行灌溉的时间t

输出描述:

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

样例输入输出:

样例输入:

3 6

2

2 2 

3 4

1

样例输出:

9

第一次:

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

第二次:

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

设计思路:

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

AC代码:


  
  1. #灌溉
  2. n,m = map( int, input().split())
  3. L = [[ 0 for j in range(m)] for i in range(n)]
  4. A = [[ 0 for j in range(m)] for i in range(n)]
  5. k = int( input())
  6. ##print(A)
  7. for i in range(k):
  8. a,b = map( int, input().split())
  9. L[a- 1][b- 1] = 1
  10. A[a- 1][b- 1] = 1
  11. ##print(A)
  12. ##def fun(L):
  13. ## l = [[0 for j in range(len(L[0]))]for i in range(len(L))]
  14. ## return l
  15. t = int( input())
  16. for x in range( 2*t):
  17. if x% 2== 0:
  18. for i in range(n):
  19. for j in range(m):
  20. if L[i][j]== 1:
  21. if j+ 1<m:
  22. A[i][j+ 1] = 1
  23. if j- 1>= 0:
  24. A[i][j- 1] = 1
  25. if i- 1>= 0:
  26. A[i- 1][j] = 1
  27. if i+ 1<n:
  28. A[i+ 1][j] = 1
  29. break
  30. else:
  31. for i in range(n):
  32. for j in range(m):
  33. L[i][j]=A[i][j]
  34. ##A = fun(L)
  35. ##print(A)
  36. count = 0
  37. ##print(L)
  38. ##print(A)
  39. for i in range(n):
  40. for j in range(m):
  41. if L[i][j]== 1:
  42. count+= 1
  43. print(count)

 小彩蛋:

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

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

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

 

 正确示范:

代码:


 结果:

每日一句

摘自《《晚熟的人》》:

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


转载:https://blog.csdn.net/weixin_54201782/article/details/128505714
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场