问题描述:共14分(4+2+3+3+2分)
给出一个凸多边形,可以取得若干个内接三角形,同时约定内接三角形必 须有一条边(仅能有一条边)与凸多边形的边相重合,例如:下面的5边形中,可能有 的内接三角形有5种:
问题:当依次给出凸多边形的每个顶点的2个坐标之后,找出一个面积最大的内接三角
形,输出该三角形的面积与三个顶点的坐标。
[算法说明]:凸多边形的每个顶点用一对坐标(x,y)表示;
用数组p:array[1..2*n] of point; 存贮输入的顶点坐标;
同时编制一个由三角形的三个顶点计算其面积的函数sea。
program exp5(input,output);
const n=6;
type point=record x,y:real end;
var p :array[1..2*n] of point;
i,j :integer;
q1,q2,q3 :point;
smax :real;
function sea(p1,p2,p3:point):real;
var s1,s2,s3,p4:real;
begin
s1:=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
s2:=sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y));
s3:=sqrt((p2.x-p3.x)*(p2.x-p3.x)+(p2.y-p3.y)*(p2.y-p3.y));
p4:= (S1+S2+S3)/2 ; sea:=sqrt(p4*(p4-s1)*(p4-s2)*(p4-s3));
end;
begin
for i:=1 to n do readln(p[i].x,p[i].y); smax:=0;
for i:=1 to n-1 do P[n+i]:=P[i]
for i:=1 to n do
for j:= i+3 TO i+2+n-4 do
if Smax<Sea(P[i],P[i+1],P[j]) then
begin
smax:=sea(p[i],p[i+1],p[j]);
q1:=p[i]; q2:= P[i+1] ; q3:=p[j]
end;
writeln(smax,q1.x,q1.y,q2.x,q2.y,q3.x,q3.y)
end.