news 2026/6/3 13:26:01

UVa 376 More Triangles THE AMBIGUOUS CASE

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 376 More Triangles THE AMBIGUOUS CASE

题目描述

三角学中的歧义情况ambiguous case\texttt{ambiguous case}ambiguous case)是指在已知两边和其中一边的对角时求解三角形。你需要编写一个程序,接收这样的数据并报告所有解。

输入格式

每行包含三个实数:前两个表示三角形的两边长度,第三个表示与第二边相对的角(以度为单位)。输入以0.0 0.0 0.0结束。

输出格式

对于每个数据,报告解的数量。如果有解,报告对应的第三边长度(保留两位小数)。如果有两个解,按递减顺序输出。无解时输出000

样例输入

2.00 2.00 30.00 2.00 3.00 130.00 1.00 1.00 90.00 698.64 217.77 5.52 0.00 0.00 0.00

样例输出

Case A B THETA # of Side Side # side side (deg) Triags 1 2 1 2.00 2.00 30.00 1 3.46 2 2.00 3.00 130.00 1 1.29 3 1.00 1.00 90.00 0 4 698.64 217.77 5.52 2 902.54 488.26 END OF REPORT for 4 cases

题目分析

问题的本质

这是一个解三角形问题。已知两边aaabbb和边bbb的对角BBB,求解第三边ccc的长度。

已知条件

  • aaa:第一条边的长度
  • bbb:第二条边的长度(对角为BBB
  • BBB:边bbb的对角(以度为单位)

需要求解第三边ccc的可能长度。

余弦定理的应用

由余弦定理,边bbb满足:
b2=a2+c2−2accos⁡B b^2 = a^2 + c^2 - 2ac\cos Bb2=a2+c22accosB

将其整理为关于ccc的一元二次方程:
c2−(2acos⁡B)⋅c+(a2−b2)=0 c^2 - (2a\cos B) \cdot c + (a^2 - b^2) = 0c2(2acosB)c+(a2b2)=0

记:
Δ=(2acos⁡B)2−4(a2−b2)=4(b2−a2sin⁡2B) \Delta = (2a\cos B)^2 - 4(a^2 - b^2) = 4(b^2 - a^2\sin^2 B)Δ=(2acosB)24(a2b2)=4(b2a2sin2B)

则方程的解为:
c=acos⁡B±b2−a2sin⁡2B c = a\cos B \pm \sqrt{b^2 - a^2\sin^2 B}c=acosB±b2a2sin2B

歧义情况的分类

根据判别式和根的正负性,解的情况分为以下几类:

情况 1:BBB为锐角
  • 如果b<asin⁡Bb < a\sin Bb<asinBΔ<0\Delta < 0Δ<0,无解
  • 如果b=asin⁡Bb = a\sin Bb=asinBΔ=0\Delta = 0Δ=0,一个解(直角三角形),此时c=acos⁡Bc = a\cos Bc=acosB
  • 如果b>asin⁡Bb > a\sin Bb>asinBΔ>0\Delta > 0Δ>0,两个正根:
    • b≥ab \ge aba,两根均为正,但其中一根为acos⁡B−⋯a\cos B - \sqrt{\cdots}acosB可能为负,需进一步判断,实际只有一个有效解
    • b<ab < ab<a,两根均为正,两个有效解
情况 2:BBB为钝角

此时cos⁡B<0\cos B < 0cosB<0acos⁡Ba\cos BacosB为负数。两根中acos⁡B−⋯a\cos B - \sqrt{\cdots}acosB为负,舍去;acos⁡B+⋯a\cos B + \sqrt{\cdots}acosB+可能为正也可能为负:

  • 如果b≤ab \le aba:无解
  • 如果b>ab > ab>a:一个正解
情况 3:B=90∘B = 90^\circB=90

此时cos⁡B=0\cos B = 0cosB=0sin⁡B=1\sin B = 1sinB=1,方程简化为c2=b2−a2c^2 = b^2 - a^2c2=b2a2

  • 如果b≤ab \le aba:无解
  • 如果b>ab > ab>a:一个解c=b2−a2c = \sqrt{b^2 - a^2}c=b2a2

参考代码

// More Triangles THE AMBIGUOUS CASE// UVa ID: 376// Verdict: Accepted// Submission Date: 2016-07-08// UVa Run Time: 0.050s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constdoublePI=2.0*acos(0.0);constdoubleEPSILON=1e-7;intmain(intargc,char*argv[]){ios::sync_with_stdio(false);intcases=0;doublea,b,B;vector<tuple<int,double,double,double,double,double>>triangles;while(cin>>a>>b>>B){if(fabs(a)+fabs(b)+fabs(B)<EPSILON)break;// B 为 0 或 180 度if(fabs(B)<=EPSILON||fabs(B-180.0)<=EPSILON){triangles.push_back({++cases,a,b,B,a+b,fabs(a-b)});continue;}// 零长度边if(a<EPSILON||b<EPSILON){triangles.push_back({++cases,a,b,B,-1.0,-1.0});continue;}doubleangle=B;doubleradB=B*PI/180.0;if(angle<90.0-EPSILON){// 锐角doubleh=a*sin(radB);if(b<h-EPSILON){triangles.push_back({++cases,a,b,angle,-1.0,-1.0});}elseif(fabs(b-h)<=EPSILON){triangles.push_back({++cases,a,b,angle,a*cos(radB),-1.0});}else{if(b>=a-EPSILON){doubleA=asin(a*sin(radB)/b);doubleC=PI-A-radB;doublec=sqrt(a*a+b*b-2*a*b*cos(C));triangles.push_back({++cases,a,b,angle,c,-1.0});}else{doubleoffset=sqrt(b*b-a*a*sin(radB)*sin(radB));doublec1=a*cos(radB)+offset;doublec2=a*cos(radB)-offset;if(c1<c2)swap(c1,c2);triangles.push_back({++cases,a,b,angle,c1,c2});}}}elseif(angle>90.0+EPSILON){// 钝角if(b<a-EPSILON){triangles.push_back({++cases,a,b,angle,-1.0,-1.0});}else{doubleA=asin(a*sin(radB)/b);doubleC=PI-A-radB;doublec=sqrt(a*a+b*b-2*a*b*cos(C));triangles.push_back({++cases,a,b,angle,c,-1.0});}}else{// 直角if(b<=a+EPSILON){triangles.push_back({++cases,a,b,angle,-1.0,-1.0});}else{triangles.push_back({++cases,a,b,angle,sqrt(b*b-a*a),-1.0});}}}// 输出表头cout<<"Case A B THETA # of Side Side"<<endl;cout<<" # side side (deg) Triags 1 2"<<endl;// 输出结果for(auto&t:triangles){intidx=get<0>(t);doublesideA=get<1>(t);doublesideB=get<2>(t);doubletheta=get<3>(t);doublec1=get<4>(t);doublec2=get<5>(t);cout<<setw(4)<<right<<idx;cout<<setw(7)<<right<<fixed<<setprecision(2)<<sideA;cout<<setw(7)<<right<<fixed<<setprecision(2)<<sideB;cout<<setw(7)<<right<<fixed<<setprecision(2)<<theta;cout<<setw(6)<<right<<((c1>0.0)+(c2>0.0));if(c1>0.0)cout<<setw(9)<<right<<fixed<<setprecision(2)<<c1;if(c2>0.0)cout<<setw(7)<<right<<fixed<<setprecision(2)<<c2;cout<<endl;}cout<<endl;cout<<"END OF REPORT for "<<cases<<" cases"<<endl;return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 13:24:14

2026年AI岗位薪资揭秘:高薪诱惑下的进阶之路,小白也能收藏学习!

本文揭秘了2026年AI岗位的薪资情况&#xff0c;指出薪资涨幅显著但门槛也在提高。大厂校招AI相关岗位年薪普遍在35-50万&#xff0c;社招分层明显&#xff0c;顶尖人才年薪百万。文章建议普通从业者关注AI应用层面机会&#xff0c;并强调积累实际经验的重要性。 最近春招季&…

作者头像 李华
网站建设 2026/6/3 13:24:11

AGI代码领域争霸:Claude Opus 4.8登顶,OpenAI GPT-5.6本周或登场逆袭?

AGI代码领域争霸战况激烈OpenAI和Anthropic为争夺代码领域霸主地位战况激烈&#xff0c;AGI Ranker最新Coding排行榜上&#xff0c;Claude Opus 4.8登顶&#xff0c;GPT-5.5以77.48分落后3.5分。编程王座三个月内三次易主三个月内&#xff0c;编程王座几经易主。第一次Claude O…

作者头像 李华
网站建设 2026/6/3 13:21:58

微信靓号展示小程序源码:含筛选、地区选择、详情页与订单流程

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;一套可直接运行的微信小程序源码&#xff0c;专注靓号信息呈现与用户交互。支持号码列表滚动加载、按尾号/连号/重复数等条件筛选、全国省市两级地区选择、单个号码详情查看&#xff08;含价格、类型、状态&…

作者头像 李华
网站建设 2026/6/3 13:21:01

深入Jonker-Volgenant算法:scipy中linear_sum_assignment函数背后的高效匹配引擎

深入Jonker-Volgenant算法&#xff1a;scipy中linear_sum_assignment函数背后的高效匹配引擎在解决资源分配问题时&#xff0c;我们常常需要找到一种最优的匹配方式&#xff0c;使得总成本最低或收益最大。这类问题在计算机科学、运筹学、经济学等领域有着广泛的应用。scipy库中…

作者头像 李华
网站建设 2026/6/3 13:18:57

Wi-Fi室内定位技术:原理、实现与实战应用解析

1. 项目概述&#xff1a;用Wi-Fi信号给你的设备装上“室内GPS”如果你曾经在大型商场的地下停车场找过车&#xff0c;或者在错综复杂的医院大楼里迷过路&#xff0c;你大概能体会那种对精准室内定位的迫切需求。GPS在户外是王者&#xff0c;但一进到钢筋水泥的建筑内部&#xf…

作者头像 李华