3--百度2017春招笔试真题编程题集合--寻找三角形 (Python)

三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用'R', 'G', 'B'表示。 
现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。
但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。 

输入描述:
首先输入一个正整数N三维坐标系内的点的个数.(N <= 50) 

接下来N行,每一行输入 c x y z,c为'R', 'G', 'B' 的其中一个。x,y,z是该点的坐标。(坐标均是0到999之间的整数)


输出描述:
输出一个数表示最大的三角形面积,保留5位小数。

输入例子:
5
R 0 0 0
R 0 4 0
R 0 0 3
G 92 14 7
G 12 16 8

输出例子:
6.00000


代码:

import sys
class Node:
    def __init__(self,l):
        self.color = l[0]
        self.x = int(l[1])
        self.y = int(l[2])
        self.z = int(l[3])

class Solution():
    def __init__(self,l):
        self.l = l

    def main(self,n):
        i,j,k = 0,0,0
        max = 0
        for i in range(n):
            for j in range(i+1,n):
                for k in range(j+1,n):
                    if self.isSan(i,j,k) and self.colorIsRight(i,j,k):
                        area = self.getArea(i,j,k)
                        if max < area:
                            max = area
        return max

    def isSan(self,i,j,k):
        a = self.getlength(i,j)
        b = self.getlength(i,k)
        c = self.getlength(k,j)
        if a<b+c and b<a+c and c<a+b:
            return True
        return False

    def getlength(self,i,j):
        x = abs(self.l[i].x-self.l[j].x)
        y = abs(self.l[i].y-self.l[j].y)
        z = abs(self.l[i].z-self.l[j].z)
        return (x*x+y*y+z*z)**0.5

    def colorIsRight(self,i,j,k):
        ci = self.l[i].color
        cj = self.l[j].color
        ck = self.l[k].color
        if ci == cj == ck or (ci!=cj and ci!=ck and cj!=ck):
            return True
        return False

    def getArea(self,i,j,k):
        a = self.getlength(i,j)
        b = self.getlength(i,k)
        c = self.getlength(j,k)
        p = 0.5*(a+b+c)
        S = (p*(p-a)*(p-b)*(p-c))**0.5
        return S

if __name__=='__main__':
        n = int(sys.stdin.readline())
        l =[]
        for i in range(n):
            node_str = sys.stdin.readline().strip().split()
            node = Node(node_str)
            l.append(node)
        s=Solution(l)
        print("%.5f"%s.main(n))    


解题思路:
1.Node类,表示点。表示点的颜色color,点的坐标x,y,z

2.Solution类中:(1)isSan函数用来判断三个点能够组成三角形(两边之和大于第三边)(2)getlength函数用来计算两点之间的距离。(3)colorIsRight函数用来判断三个点的颜色是否全部相同或者全部不同。(4)getArea函数用来计算三个点组成的三角形的面积(海伦公式)(5)main函数主要用来遍历所有点组成的三角形的组合。一一判断是否是最大面积的三角形,并记录下最大面积。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值