大家好,又见面了,我是你们的朋友全栈君。
一、题目内容:
二、思路:
看到这个图案,肯定是自相似的,所以肯定用递归解决这个问题。
但是具体怎样的呢?
(1)这个其实就是二维矩阵,所以是要判断每个位置是不是要填给定字符,如果确定了每个位置填或不填,那不就解决问题了嘛;
(2)用两个for循环不就遍历了所有的位置了么,所以这个也简单,现在的难点在于如何知道每个位置要填,所以用一个函数判断;
(3)这个判断的函数需要三个参数,一个是边长数,另外两个是坐标。边界条件是n=1就返回True(只有一个位置,那肯定要填的);另一种情况是判断坐标是不是在中间,在中间则不填,返回False;如果上述两种情况都不是,那就递归自身寻找答案,至于里面的参数,肯定是要减小规模的,边长除以3取商好理解,坐标不是太好理解的,需要自己去试,比如下面这两个位置,其实就是同一个问题的更小规模,取余正好就得到了答案。
三、python代码:
def carpet(n, char):
def check(n, x, y): # 难点在这个判断函数,使用了递归
if n<=1: # 边界条件(只有一个位置,那肯定要填的)
return True
n2 = n // 3
if n2<=x<n2*2 and n2<=y<n2*2: #正方形中间的位置不填
return False
# 前两种情况都不是,这个位置是否填,需要递归调用才能知道,
# 里面的3个参数都需要减小规模,n2为边长(取商),x,y是坐标位置,
# 取余就是减小规模对应的子位置。
return check(n2, x%n2, y%n2)
for x in range(n):
for y in range(n):
if check(n, x, y):
print(char, end='')
else:
print(' '*len(char), end='') # 这个是输入空格的情况
print('')
if __name__ == "__main__":
n = int(input())
char = input()
carpet(n, char)
4、总结
(1)看到这种在二维矩阵的图案或者字母啥的,肯定是要遍历每个位置的,用两个for循环;
(2)对于大问题是由小问题组成的,需要用递归,用递归的时候,三要素(边界条件、减小规模、调用自身)要注意。不要想每一步怎么出来的,要站在一定的高度想问题,也就是说,想最小的问题是怎么解决的,那整个问题就是怎么解决的,所以每次就按最小问题来写代码。如本题中,你就想成3×3的正方形,3×3怎么出来的,当把规模变大,还是一样的解决办法。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158442.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...