1 条题解

  • 0
    @ 2025-5-6 11:50:04

    题意分析

    1. 问题本质:已知两个地标的坐标和从当前位置到这两个地标的方向,求当前位置的坐标。
    2. 关键点
      • 方向是从正北方向顺时针测量的角度。
      • 两个地标的方向不能相同或正好相差180度(确保有唯一解)。
      • 需要解两条方向线的交点。

    解题思路

    1. 方向线计算

      • 将方向角度转换为斜率。方向d表示从正北方向顺时针的角度,因此与数学上的角度定义不同。
      • 方向d对应的直线斜率可以通过tan(90 - d)度计算(因为0度是北,相当于数学中的90度)。
      • 注意处理垂直和水平方向的特例。
    2. 交点求解

      • 对于每个地标,计算其方向线的方程。
      • 解这两条直线的交点,即为当前位置的坐标。
    3. 边界条件

      • 确保坐标在[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
    上传者