没有白走的路,每一步都算数🎈🎈🎈
题目描述:
一个长方形块,在方形块的中间位置有给定的水管,这些水管在单位时间会往上下左右四个方向进行灌溉。问在给定的方块中,一定时间后,给定的方块中的水管会灌溉多少块小正方形。其中原本放有水管的位置就已经被灌溉。
输入描述:
第一行:
输入长方形的长度和宽度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数组的值也会变更。
如下所示:(错误示范❌)
正确示范:
代码:
结果:
每日一句
摘自《《晚熟的人》》:
假如你不努力,一年后你还是原来的你,只是一岁。
转载:https://blog.csdn.net/weixin_54201782/article/details/128505714
查看评论