链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086
考查判断线段相交,今天刚好学习了一下,拿来练练手。
#include <cstdio>
#define MAX 100 + 10
typedef struct {
double x;
double y;
} Node;
Node node[MAX];
Node point[MAX];
double Direction( Node pi, Node pj, Node pk ) {
return ( pk.x - pi.x ) * ( pj.y - pi.y ) - ( pj.x - pi.x ) * ( pk.y - pi.y );
}
bool Segments_X( Node p1, Node p2, Node p3, Node p4 ) {
double d1, d2, d3, d4;
d1 = Direction( p3, p4, p1 );
d2 = Direction( p3, p4, p2 );
d3 = Direction( p1, p2, p3 );
d4 = Direction( p1, p2, p4 );
if( d1 * d2 <= 0 && d3 * d4 <= 0 ) return true;
return false;
}
int main() {
int n;
while( 1 ) {
scanf( "%d", &n );
if( n == 0 ) break;
for( int i = 1; i <= n; i++ ) {
scanf( "%lf%lf%lf%lf", &node[i].x, &node[i].y, &point[i].x, &point[i].y );
}
int cnt = 0;
for( int i = 1; i <= n - 1; i++ ) {
for( int j = i + 1; j <= n; j++ ) {
if( Segments_X( node[i], point[i], node[j], point[j] ) ) cnt++;
}
}
printf( "%d\n", cnt );
}
return 0;
}