1401.寻找最大内角
时间限制: 1000 MS 内存限制: 65536 K
提交数: 288 (0 users) 通过数: 198 (190 users)
问题描述
请定义Point结构体,Point结构体有两个int域代表点的坐标。以结构体变量作为参数,编写GetMaxAngle(Point A, Point B, Point C)函数,表示获得三个点构成的三角形中最大的内角角度。现在给你N个点的坐标,问在这些点中任意选取3个点作为三角形,有可能得到的最大内角是多少。
输入格式
第一行输入一个整数N,代表点的个数。(N<=50)
接下来N行每行两个整数X Y,代表每个点的坐标,(0<=X,Y<=1000),保证没有重叠点以及三点共线。
输出格式
输出一个实数,表示最大内角的度数,弧度制,保留6位小数。
样例输入
4
0 0
5 5
3 5
4 6
样例输出
2.896614
来源
时间限制: 1000 MS 内存限制: 65536 K
提交数: 288 (0 users) 通过数: 198 (190 users)
问题描述
请定义Point结构体,Point结构体有两个int域代表点的坐标。以结构体变量作为参数,编写GetMaxAngle(Point A, Point B, Point C)函数,表示获得三个点构成的三角形中最大的内角角度。现在给你N个点的坐标,问在这些点中任意选取3个点作为三角形,有可能得到的最大内角是多少。
输入格式
第一行输入一个整数N,代表点的个数。(N<=50)
接下来N行每行两个整数X Y,代表每个点的坐标,(0<=X,Y<=1000),保证没有重叠点以及三点共线。
输出格式
输出一个实数,表示最大内角的度数,弧度制,保留6位小数。
样例输入
4
0 0
5 5
3 5
4 6
样例输出
2.896614
来源
xmu
#include <stdio.h>
#include <math.h>
struct Point
{
int x;
int y;
};
double GetMaxAngle(struct Point A, struct Point B, struct Point C)
{
double angle_a, angle_b, angle_c;
double a, b, c;
double max;
a = sqrt((B.x - C.x) * (B.x - C.x) + (B.y - C.y) * (B.y - C.y));
b = sqrt((A.x - C.x) * (A.x - C.x) + (A.y - C.y) * (A.y - C.y));
c = sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
angle_a = acos((b * b + c * c - a * a) / (2.0 * b * c));
angle_b = acos((c * c + a * a - b * b) / (2.0 * c * a));
angle_c = acos((a * a + b * b - c * c) / (2.0 * a * b));
max = angle_a;
if (angle_b > max)
max = angle_b;
if (angle_c > max)
max = angle_c;
return max;
}
double max_angle(struct Point array[], int n)
{
int i, j, k;
double max = -0x3f3f3f3f, temp;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
for (k = 0; k < n; ++k)
{
temp = GetMaxAngle(array[i], array[j], array[k]);
if (temp > max)
max = temp;
}
}
}
return max;
}
int main()
{
int n, i;
struct Point array[55];
scanf("%d", &n);
for (i = 0; i < n; ++i)
scanf("%d %d", &array[i].x, &array[i].y);
printf("%.6lf\n", max_angle(array, n));
return 0;
}