通过这个题知道了余弦定理的使用。cos A=(b*b+c*c-a*a)/(2*b*c); 之后通过acos(cos A)就可以得出弧度来了。
弧度乘以半径就是轨距。再把多个轨迹相加就得出答案了。
ac代码:
#include <iostream>
#include <cmath>
using namespace std;
const double PI=acos(-1.0);
struct node
{
double x;
double y;
}arr[53],temp;
int main()
{
int N;
cin>>N;
int abc=1;
while(N--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i].x ;
cin>>arr[i].y ;
}
arr[n]=arr[0]; arr[n+1]=arr[1];
cin>>temp.x>>temp.y; //
double sum=0;
for(int i=0;i<n;i++)
{
double a=sqrt(pow(arr[i].x-arr[i+2].x ,2)+pow(arr[i].y -arr[i+2].y,2));
double b=sqrt(pow(arr[i].x-arr[i+1].x ,2)+pow(arr[i].y -arr[i+1].y,2));
double c=sqrt(pow(arr[i+1].x-arr[i+2].x ,2)+pow(arr[i+1].y -arr[i+2].y,2));
double d=(b*b+c*c-a*a)/(2*b*c);
double e=acos(d);
e=PI-e;
double r=sqrt(pow(arr[i+1].x-temp.x,2)+pow(arr[i+1].y-temp.y ,2));
sum=sum+e*r;
}
cout<<"Case #"<<abc++<<": ";
printf("%.3f\n",sum);
}
return 0;
}