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)简直疯狂了。。。 #include <iostream> #include <fstream> #define in cin using namespace std; class Point { public: int x, y; }; int direction ( Point a, Point b, Point c ) { return ( c.x - a.x ) * ( b.y - a.y ) - ( b.x - a.x ) * ( c.y - a.y ); } int min ( int a, int b ) { return a > b ? b : a; } int max ( int a, int b ) { return a > b ? a : b; } bool onsegment ( Point a, Point b, Point c ) { if ( min ( a.x, b.x ) <= c.x && c.x <= max ( a.x, b.x ) && min ( a.y, b.y ) <= c.y && c.y <= max ( a.y, b.y ) ) return true; return false; } bool segmentsintersect ( Point p1, Point p2, Point p3, Point p4 ) { int d1 = direction ( p3, p4, p1 ); int d2 = direction ( p3, p4, p2 ); int d3 = direction ( p1, p2, p3 ); int d4 = direction ( p1, p2, p4 ); if ( ( ( d1 > 0 && d2 < 0 ) || ( d1 < 0 && d2 > 0 ) ) && ( ( d3 > 0 && d4 < 0 ) || ( d3 < 0 && d4 > 0 ) ) ) return true; else if ( d1 == 0 && onsegment ( p3, p4, p1 ) ) return true; else if ( d2 == 0 && onsegment ( p3, p4, p2 ) ) return true; else if ( d3 == 0 && onsegment ( p1, p2, p3 ) ) return true; else if ( d4 == 0 && onsegment ( p1, p2, p4 ) ) return true; else return false; } int main () { Point start, end, leftup, rightbottom; int t; for ( in >> t; t > 0; t -- ) { in >> start.x >> start.y >> end.x >> end.y >> leftup.x >> leftup.y >> rightbottom.x >> rightbottom.y; if ( leftup.x > rightbottom.x ) { int t = leftup.x; leftup.x = rightbottom.x; rightbottom.x = leftup.x; } if ( leftup.y < rightbottom.y ) { int t = leftup.y; leftup.y = rightbottom.y; rightbottom.y = t; } Point rightup, leftbottom; rightup.x = rightbottom.x; rightup.y = leftup.y; leftbottom.x = leftup.x; leftbottom.y = rightbottom.y; if ( segmentsintersect ( start, end, leftup, leftbottom ) || segmentsintersect ( start, end, leftbottom, rightbottom ) || segmentsintersect ( start, end, rightbottom, rightup ) || segmentsintersect ( start, end, rightup, leftup ) ) cout << "T"; else cout << "F"; cout << endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator