题目链接:1298
1298 圆与三角形 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"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
代码:
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> using namespace std; struct node{ double x,y; double chang; }dian[4]; double li(int i,int j) { return ((dian[i].x-dian[j].x)*(dian[i].x-dian[j].x)+(dian[i].y-dian[j].y)*(dian[i].y-dian[j].y)); } bool pan(int i,int j) { double tt=sqrt(li(i,j)); double xx=(dian[j].x-dian[i].x)/tt; double yy=(dian[j].y-dian[i].y)/tt; double x1=dian[i].x-dian[0].x; double y1=dian[i].y-dian[0].y; double xxx=(x1*xx+y1*yy)/(xx*xx+yy*yy); xxx=-xxx; if (xxx>=0&&xxx<=tt) { if ((x1+xx*xxx)*(x1+xx*xxx)+(y1+yy*xxx)*(y1+yy*xxx)<=dian[0].chang) return true; else return false; } else return false; } void slove() { cin>>dian[0].x>>dian[0].y>>dian[0].chang; dian[0].chang*=dian[0].chang; for (int i=1;i<4;i++) { cin>>dian[i].x>>dian[i].y; dian[i].chang=li(0,i); } int a=0,b=0; for (int i=1;i<4;i++) if (dian[i].chang==dian[0].chang) { printf("Yes\n"); return; } else if (dian[i].chang<dian[0].chang) a++; else b++; if (a&&b) { printf("Yes\n"); return; } if (a) { printf("No\n"); return; } if (pan(1,2)) { printf("Yes\n"); return; } if (pan(1,3)) { printf("Yes\n"); return; } if (pan(2,3)) { printf("Yes\n"); return; } printf("No\n"); return ; } int main() { /* freopen("text.in","r",stdin); freopen("text.out","w",stdout);*/ int t;scanf("%d",&t); while (t--) slove(); return 0; }