美文网首页
Python计算,指定半径内,有多少个完整的正方形和不完整的

Python计算,指定半径内,有多少个完整的正方形和不完整的

作者: 狂奔的胖蜗牛 | 来源:发表于2018-01-19 11:00 被阅读36次

题目:

如下图所示:有一个无限大的方块矩阵,每个方块边长为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]

相关文章

网友评论

      本文标题:Python计算,指定半径内,有多少个完整的正方形和不完整的

      本文链接:https://www.haomeiwen.com/subject/tmfooxtx.html