1 条题解
-
0
解题思路
已知正多边形的三个顶点坐标,由于正多边形的性质,可以通过这三个点确定正多边形的所有顶点坐标。对于正n边形,其中心可以通过一定的几何方法计算得出(例如利用正多边形的对称性)。得到正多边形的所有顶点坐标后,找出这些顶点中x坐标的最大值、最小值,y坐标的最大值、最小值。最小矩形的长为x坐标最大值与最小值的差,宽为y坐标最大值与最小值的差,矩形面积为长乘宽。
实现步骤
读取测试用例的数量(通过判断n是否为0来确定测试用例的结束)。 对于每个测试用例:读取正多边形的顶点数量n和三个顶点的坐标((x_1, y_1)),((x_2, y_2)),((x_3, y_3))。计算正多边形的中心坐标(具体计算方法根据正多边形的几何性质,例如先计算任意两点连线的中垂线,两条中垂线的交点即为中心)。根据中心坐标和正多边形的性质,计算出正多边形的所有顶点坐标。遍历所有顶点坐标,找出x坐标的最大值(max_x)、最小值(min_x),y坐标的最大值(max_y)、最小值(min_y)。计算最小矩形的面积(area = (max_x - min_x) * (max_y - min_y))。按照格式输出结果。
代码
#include <cstdio> #include <algorithm> #include <cmath> using namespace std; int INF = 0x3f3f3f3f; double pi = acos(-1); struct Point{ double x,y; }a,b,c; Point cal_cirle(Point a,Point b,Point c) { Point ret; ret.x = ((b.y-c.y) * (pow(a.x,2)-pow(b.x,2)+pow(a.y,2)-pow(b.y,2)) - (a.y-b.y) * (pow(b.x,2)-pow(c.x,2)+pow(b.y,2)-pow(c.y,2))) / ((a.x-b.x)*(b.y-c.y)-(b.x-c.x)*(a.y-b.y)) / 2; ret.y = -(a.x-b.x) / (a.y-b.y) * (ret.x - (a.x+b.x)/2) + (a.y+b.y) / 2; return ret; } double solve(Point a,Point p,int n) { double r = 2 * pi / n; double mxx = a.x,mnx = a.x,mxy = a.y,mny = a.y; for( int i = 0; i < n; i++ ){ double tmpx = (a.x - p.x) * cos(i*r) - (a.y - p.y) * sin(i*r) + p.x; double tmpy = (a.x - p.x) * sin(i*r) - (a.y - p.y) * cos(i*r) + p.y; mxx = max(mxx,tmpx); mnx = min(mnx,tmpx); mxy = max(mxy,tmpy); mny = min(mny,tmpy); } return (mxx - mnx) * (mxy - mny); } int main() { int n,cas = 1; while(~scanf("%d",&n),n){ scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y); Point p = cal_cirle(a,b,c); printf("Polygon %d: %.3f\n",cas++,solve(a,p,n)); } return 0; }
- 1
信息
- ID
- 1505
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者