1 条题解
-
0
题意分析:
- 问题本质:已知两个地标的坐标和从当前位置到这两个地标的方向,求当前位置的坐标。
- 关键点:
- 方向是从正北方向顺时针测量的角度。
- 两个地标的方向不能相同或正好相差180度(确保有唯一解)。
- 需要解两条方向线的交点。
解题思路:
-
方向线计算:
- 将方向角度转换为斜率。方向d表示从正北方向顺时针的角度,因此与数学上的角度定义不同。
- 方向d对应的直线斜率可以通过tan(90 - d)度计算(因为0度是北,相当于数学中的90度)。
- 注意处理垂直和水平方向的特例。
-
交点求解:
- 对于每个地标,计算其方向线的方程。
- 解这两条直线的交点,即为当前位置的坐标。
-
边界条件:
- 确保坐标在[0, 100]范围内。
- 处理方向为0度、90度、180度、270度等特殊情况。
#include <cmath> #include <cstdio> using namespace std; const double pi=acos(-1.0); struct P { double x,y; }a,b,c,d; double det(double x1,double y1,double x2,double y2) { return x1*y2-x2*y1; } int main() { int cases; scanf("%d",&cases); while(cases--){ double alpha; scanf("%lf%lf%lf",&a.x,&a.y,&alpha); alpha=pi*(450-alpha)/180; b.x=a.x+cos(alpha); b.y=a.y+sin(alpha); scanf("%lf%lf%lf",&c.x,&c.y,&alpha); alpha=pi*(450-alpha)/180; d.x=c.x+cos(alpha); d.y=c.y+sin(alpha); double s1=det(c.x-a.x,c.y-a.y,b.x-a.x,b.y-a.y); double s2=det(d.x-a.x,d.y-a.y,b.x-a.x,b.y-a.y); double xx=(s1*d.x-s2*c.x)/(s1-s2); double yy=(s1*d.y-s2*c.y)/(s1-s2); printf("%.4lf %.4lf\n",xx+1e-9,yy+1e-9); } return 0; }
- 1
信息
- ID
- 255
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 0
- 上传者