地址:http://acm.hit.edu.cn/judge/show.php?Proid=1027
思路:假设A、B是外部矩形的长和宽,X、Y是内部矩形的长和宽,首先确保长>=宽,否则进行swap;分三种情况进行讨论,当Y>=B时不可能;当X<A&&Y<B时可能;当X>=A&&Y<B时待定。对于第三种情况,将外部矩形和内部矩形的中心重叠并固定好,内部矩形可以围绕中心旋转,假设极限情况即内部矩形的一角刚好搭在外部矩形的长边的延长线上,此时判断内部矩形相邻一角是否在外部矩形内即可。
代码如下:
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
void swap(double &x, double &y)
{
double tmp;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int num;
double A, B, X, Y;
double diagIn;
double radian1, radian2;
double result;
scanf("%d", &num);
while(num)
{
num--;
scanf("%lf%lf%lf%lf", &A, &B, &X, &Y);
if(A < B)
swap(A, B);
if(X < Y)
swap(X, Y);
if(Y >= B)
{
printf("Box cannot be dropped.\n");
}
else if(X < A && Y < B)
{
printf("Escape is possible.\n");
}
else
{
diagIn = sqrt(pow(X / 2.0, 2) + pow(Y / 2.0, 2));
radian1 = acos(B / (2 * diagIn));
radian2 = 2 * acos(X / (2 * diagIn));
result = diagIn * cos(PI / 2 - radian1 - radian2);
if(result < A / 2.0)
{
printf("Escape is possible.\n");
}
else
{
printf("Box cannot be dropped.\n");
}
}
}
return 0;
}