三维空间中有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函数主要用来遍历所有点组成的三角形的组合。一一判断是否是最大面积的三角形,并记录下最大面积。