51 Nod 1298 圆与三角形(计算几何)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298

题目:

1298 圆与三角形

给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"Yes",否则输出"No"。(三角形的面积大于0)。

Input

第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据。
4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R。(-3000 <= xc, yc <= 3000, 1 <= R <= 3000)
4-2:2个数,三角形第1个点的坐标。
4-3:2个数,三角形第2个点的坐标。
4-4:2个数,三角形第3个点的坐标。(-3000 <= xi, yi <= 3000)

Output

共T行,对于每组输入数据,相交输出"Yes",否则输出"No"。

Input示例

2
0 0 10
10 0
15 0
15 5
0 0 10
0 0
5 0
5 5

Output示例

Yes
No题解:模板题
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 #define PI acos(-1.0)
 5 #define INF 0x3f3f3f3f
 6 #define FAST_IO ios::sync_with_stdio(false)
 7
 8 typedef long long LL;
 9
10 //点结构
11 struct point{
12     double x,y;
13 };
14
15 //两点之间距离
16 double dis(point p1,point p2){
17     return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
18 }
19
20 //判断线段是否和圆相交,这个是点p1和p2都不在圆内的情况。
21 //其他的判断很简单的,单独判断一下即可。
22 bool check(point p1,point p2,point O,double r){
23     double a,b,c,dis1,dis2,angle1,angle2;
24     if(p1.x==p2.x){
25         a=1;b=0;c=-p1.x;
26     }
27     else if(p1.y==p2.y){
28         a=0;b=1;c=-p1.y;
29     }
30     else{
31         a=p1.y-p2.y;
32         b=p2.x-p1.x;
33         c=p1.x*p2.y-p1.y*p2.x;
34     }
35     dis1=a*O.x+b*O.y+c;
36     dis1*=dis1;
37     dis2=(a*a+b*b)*r*r;
38     if(dis1>dis2) return false;
39     angle1=(O.x-p1.x)*(p2.x-p1.x)+(O.y-p1.y)*(p2.y-p1.y);
40     angle2=(O.x-p2.x)*(p1.x-p2.x)+(O.y-p2.y)*(p1.y-p2.y);
41     if(angle1>0&&angle2>0) return true;
42     return false;
43 }
44
45
46 int main(){
47     int t;
48     cin>>t;
49     while(t--){
50         double r;
51         point O,p1,p2,p3;
52         cin>>O.x>>O.y>>r;
53         cin>>p1.x>>p1.y>>p2.x>>p2.y>>p3.x>>p3.y;
54         double d1=dis(p1,O);
55         double d2=dis(p2,O);
56         double d3=dis(p3,O);
57         if(d1<r&&d2<r&&d3<r) cout<<"No"<<endl;
58         else if(d1>r&&d2>r&&d3>r){
59             if(check(p1,p2,O,r)||check(p1,p3,O,r)||check(p2,p3,O,r)) cout<<"Yes"<<endl;
60             else cout<<"No"<<endl;
61         }
62         else cout<<"Yes"<<endl;
63     }
64     return 0;
65 }

原文地址:https://www.cnblogs.com/Leonard-/p/8448765.html

时间: 2024-11-08 23:08:06

51 Nod 1298 圆与三角形(计算几何)的相关文章

51nod 1298 圆与三角形 (计算几何)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 求出圆心到三条线段的最短距离,然后判断是否有顶点在圆外,就把全部情况举出来. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 const double PI =

[51nod]1298 圆与三角形

1298 圆与三角形 题目来源: HackerRank 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据. 4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R.(-3000 <= xc, yc <= 3000, 1 <= R 

1298 圆与三角形

给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据. 4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R.(-3000 <= xc, yc <= 3000, 1 <= R <= 3000) 4-2:2个数,三角形第1个点的

51nod-1298 圆与三角形(计算几何超详解)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据.4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R.

51nod 1298 园与三角形

给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据. 4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R.(-3000 <= xc, yc <= 3000, 1 <= R <= 3000) 4-2:2个数,三角形第1个点的

51 nod 1495 中国好区间

1495 中国好区间 基准时间限制:0.7 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 阿尔法在玩一个游戏,阿尔法给出了一个长度为n的序列,他认为,一段好的区间,它的长度是>=k的,且该区间的第k大的那个数,一定大于等于T.那么问题来了,阿尔法想知道有多少好的区间. 由于阿尔法的序列长度实在是太大了,无法在规定时间内读入. 他想了一个绝妙的方法. 读入a[0],b,c,p,则a[i]=(a[i-1]*b+c)mod p. 样例解释: a1~a5分别为47,135,247,3

51 nod 1766 树上的最远点对(线段树+lca)

1766 树上的最远点对 基准时间限制:3 秒 空间限制:524288 KB 分值: 80 难度:5级算法题 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c<=j<=d} (PS 建议使用读入优化) Input 第一行一个数字 n n<=100000. 第二行到第n行每行三个数字描述路的情况, x,y,z (1<=x,y<=n,1<

51 nod 1439 互质对(Moblus容斥)

1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开始集合为空.然后有一种操作每次向集合中加入一个数字或者删除一个数字.每次操作给出一个下标x(1 ≤ x ≤ n),如果a[x]已经在集合中,那么就删除a[x],否则就加入a[x]. 问每次操作之后集合中互质的数字有多少对. 注意,集合中可以有重复的数字,两个数字不同当且仅当他们的下标不同. 比如a[

51 nod 1188 最大公约数之和 V2

1188 最大公约数之和 V2 题目来源: UVA 基准时间限制:2 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计算这段程序(程序中的gcd(i,j)表示i与j的最大公约数): G=0; for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } Input 第1行:1个数T,表示后面用作输入测试的数的数量.(1 <= T <= 5000