题目:
如下图所示:有一个无限大的方块矩阵,每个方块边长为1,给出一个半径,计算出该半径的圆内,有多少个完整的方块和不完整的方块。
image.png
思路1:
计算出每个点距离各自顶点方块四个点的距离,所有距离小于半径,则是完整的方块。若最大距离大于半径并且最小距离小于半径,则是不完整的方块。
给出代码:
from math import ceil, hypot
#计算距离
def getMaxAndMinDistances(radius):
radius = int(ceil(radius))
distances = []
for row in range(radius):
for col in range(radius):
temp = [hypot(row - radius, col - radius), hypot(row - radius, radius - col - 1),
hypot(radius - row - 1, radius - col), hypot(radius - row - 1, radius - col - 1)]
distances.append((min(temp), max(temp)))
return distances
def checkio(radius):
distances = getMaxAndMinDistances(radius)
#过滤掉不符合的元素
solid = len(list(filter(lambda x: x[1] < radius, distances)))
partial = len(list(filter(lambda x: x[1] > radius > x[0], distances)))
#上面只计算了一个象限,*4既是所有的结果
return [solid * 4, partial * 4]
if __name__ == '__main__':
checkio(2) # 结果是: [4, 12]
思路2:
计算出每个点距离圆心的长度,如果小于半径,则在圆内。
代码:
def check2(radius):
ran, solid, total = range(int(radius)+1),0,0
for x in ran:
for y in ran:
#1j表示复数
solid+=abs(x+y*1j+1+1j)<=radius
total+=abs(x+y*1j)<radius
return [solid*4,(total-solid)*4]
if __name__ == '__main__':
assert checkio(2) #结果 [4, 12]