您的位置:首页 > 其它

洛谷 P2013 无线电测向

2017-10-12 18:39 113 查看

洛谷 P2013 无线电测向

题目

题目描述

艘有天线定位装置的船能通过接收当地灯塔信号来确定自己的位置。每个灯塔固定在已知点上并发出特有的信号。当船检测到信号,它可通过旋转天线直到信号达到最大强度。这样就可确定自身与该灯塔的位置关系。只要接收到两个灯塔的信息,就有可能确定船当前的位置。

编程任务:通过一对灯塔信息来确定船的位置。

灯塔和船的位置被确定在一个直角坐标系内。X 轴正向指向东,Y 轴正向指向北。船的航行路线从正北开始按顺时针用度表示。北是 0°,东是 90°,南是 180°,西是 270°。灯塔与船的位置关系用相对于船的航行方向顺时针用度表示。

输入输出格式

输入格式:

文件的第一行是一个整数,表示灯塔的数目 N(N<=30)。以下 N 行,每行表示一个灯塔,为灯塔名称(名称是 20 个以下的字母),X 坐标和 Y坐标。它们都用空格隔开。

灯塔信息下面是船的信息包括三行,一行是船的方向,其余两行是所接收到的灯塔信号。

具体如下:

输入数据 数据的含义

方向 船的航行方向;

名称1 角度1 第一个灯塔信息的名称,灯塔的方位;

名称2 角度2 第二个灯塔信息的名称,灯塔的方位。

灯塔的方位为船与灯塔所在的直线与船的航行方向的夹角(从船的航行方向开始顺时针)。2 个数据用空格隔开。

输出格式:

将船的位置(精确到2位小数)。如果无法确定船的位置,应输出”NO ANSWER”(不能使用小写)。

输入输出样例

输入样例#1:

5
a 1 5
b 1 1000
c 2 4
d 51 60
e 153 79
30
e 160
d 210


输出样例#1:

160.83 123.41


题解

跟据两个灯塔朝的方向求出斜率k1,k2,如果k1≠k2,则说明船的位置可求,然后就是求两条线段的交点的问题了

然而,我在判断字符串时卡了半天。。。

代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#define pi 3.14159265358
using namespace std;

int n;
double ka,kb,ax,ay,m,angle,xa,ya,xb,yb;
char ch;
struct string{
char w[25];
} s[35];

int x[35],y[35];

int main()
{
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>s[i].w>>x[i]>>y[i];
}
cin>>m;m-=90;
cin>>s[0].w;
for (int i=1;i<=n;i++) if (!strcmp(s[i].w,s[0].w)) {xa=x[i];ya=y[i];break;}
cin>>angle;angle=180-m-angle;ka=tan(pi/180*angle);
cin>>s[0].w;
for (int i=1;i<=n;i++) if (!strcmp(s[i].w,s[0].w)) {xb=x[i];yb=y[i];break;}
cin>>angle;angle=180-m-angle;kb=tan(pi/180*angle);
if (ka==kb) {printf("NO ANSWER");return 0;}
ax=(yb-ya+ka*xa-kb*xb)/(ka-kb);
ay=ka*(ax-xa)+ya;
printf("%.2lf %.2lf\n",ax,ay);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: