| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我都WA了N回了,有哪位过了的帮我看一下啊, 谢谢啦!!//注:在矩形内部也算相交的,与矩形边重叠也算相交!!!
#include <cstdio>
#include <cmath>
int main()
{
int n, x1, y1, x2, y2, a1, b1, a2, b2;
scanf("%d", &n);
for ( int i = 0; i < n; i++ )
{
scanf("%d%d%d%d%d%d%d%d",
&x1, &y1, &x2, &y2, &a1, &b1, &a2, &b2);
//判断线段的两个端点是否在矩形内,在就必然相交
if ( ( (x1-a1)*(x1-a2) <= 0 && (y1-b1)*(y1-b2) <= 0 ) || ( (x2-a1)*(x2-a2) <= 0 && (y2-b1)*(y2-b2) <= 0 ) )
{
printf("T\n");
continue;
}
//判断线段的所在的包围矩形 和 矩形之间是否相交,不相交就肯定线段与矩形不相交
//判断两个矩形相交的算法:左边矩形的lefttop到右边矩形lefttop的水平、垂直距离是否大于第一个矩形的宽、高
int lefttop1X = x1 > x2 ? x2 : x1;
int lefttop1Y = y1 > y2 ? y1 : y2;
int lefttop2X = a1 > a2 ? a2 : a1;
int lefttop2Y = b1 > b2 ? b1 : b2;
int width, height;
if ( lefttop1X > lefttop2X )
{
int temp = lefttop1X;
lefttop1X = lefttop2X;
lefttop2X = temp;
temp = lefttop1Y;
lefttop1Y = lefttop2Y;
lefttop2Y = temp;
width = abs ( a1 - a2 );
height = abs ( b1 - b2 );
}
else
{
width = abs ( x1 - x2 );
height = abs ( y1 - y2 );
}
if ( abs( lefttop1X - lefttop2X ) > width || abs( lefttop1Y - lefttop2Y ) > height )
{
printf("F\n");
continue;
}
//判断矩形的四个顶点是否在线段的两侧,在两侧则相交否则就不相交
int result1 = (y2-y1)*(a1-x1) - (x2-x1)*(b1-y1);
int result2 = (y2-y1)*(a1-x1) - (x2-x1)*(b2-y1);
int result3 = (y2-y1)*(a2-x1) - (x2-x1)*(b1-y1);
int result4 = (y2-y1)*(a2-x1) - (x2-x1)*(b2-y1);
if ( result1 > 0 && result2 > 0 && result3 > 0 && result4 > 0 )
{
printf("F\n");
}
else if ( result1 < 0 && result2 < 0 && result3 < 0 && result4 < 0)
{
printf("F\n");
}
else
{
printf("T\n");
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator