题目链接
题意
已知一个三角形三边边长,现在要求构造出这个三角形三个顶点,使他们都落在一个矩形内部。
思路
首先知道一个结论(猜想),如果三角形可以放进去,可以把一个顶点放在原点,然后一条边落在矩形的一条边上。
然后直接枚举第三个点,检查是否合法。
(非常暴力)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using namespace std;
ld ans[3][2];
bool solve(ld w,ld h,ld a,ld b,ld c,int i,int j,int k){
ld deg;
//i
ans[i][0] = ans[i][1] = 0.0;
//j
if(a < w + eps){
ans[j][0] = a,ans[j][1] = 0.0;
deg = acos((a*a+b*b-c*c)*1.0/(2*a*b));
}
else{
ans[j][0] = w,ans[j][1] = sqrtl(a*a-w*w);
deg = acos((a*a+b*b-c*c)*1.0/(2*a*b))+acos(w*1.0/a);
}
//k
ans[k][0] = b*cos(deg),ans[k][1] = b*sin(deg);
if(ans[k][0] < w+eps && ans[k][0] > -eps && ans[k][1] < h+eps && ans[k][1] > -eps){
for(int i=0;i<3;i++){
//if(xy[i][0]>w) xy[i][0]=w;
printf("%.8Lf ",ans[i][0]);
//if(xy[i][1]>h) xy[i][1]=h;
printf("%.8Lf ",ans[i][1]);
}
putchar('\n');
return true;
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
ld w,h,a,b,c;
cin>>w>>h>>a>>b>>c;
if(solve(w,h,a,b,c,0,1,2)) continue;
if(solve(w,h,a,c,b,1,0,2)) continue;
if(solve(w,h,b,a,c,0,2,1)) continue;
if(solve(w,h,b,c,a,2,0,1)) continue;
if(solve(w,h,c,a,b,1,2,0)) continue;
if(solve(w,h,c,b,a,2,1,0)) continue;
}
}