好几天没写博客啦,我们数字逻辑课程要考试了,现在的我还啥也不会哈哈,要从头开始复习,等俺考完数字逻辑,再更嘿嘿。
好吧,这次也要拿出八百年前写的代码了。。。 题意就是给你许多个两个点,这两个点构成一条线段,求线段相交的对数 两线段不会重合的
样例输入
3 0.00 0.00 1.00 1.00 0.00 1.00 1.00 0.00 0.00 0.00 1.00 0.00
样例输出
3
我是先剪枝,考虑多种情况 1、先判断平行的情况,平行永不相交 2、对于两条线段,如果一条线段上的x值最大的点小于另一条线段上的x值最小的点的值,同理y也是,这种情况也不会相交。 3、剪完之后,求两线段所在直线方程,带入看是否相交。。。
蛮水的一道题,错了10几次哈哈,好菜呀我。。。。。。。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std
;
struct qq
{
double x
,y
,x1
,y1
;
}q
[150];
int main()
{
int n
;
int ans
=0;
double my
,mx
,mmx
,mmy
;
double zx
,zy
,zzx
,zzy
;
double k1
,k2
,b1
,b2
;
ans
=0;
scanf("%d",&n
);
for(int i
=0;i
<n
;i
++)
{
scanf("%lf %lf %lf %lf",&q
[i
].x
,&q
[i
].y
,&q
[i
].x1
,&q
[i
].y1
);
}
for(int i
=0;i
<n
-1;i
++)
{
for(int j
=i
+1;j
<n
;j
++)
{
k1
=(q
[i
].y1
-q
[i
].y
)/(q
[i
].x1
-q
[i
].x
);
k2
=(q
[j
].y1
-q
[j
].y
)/(q
[j
].x1
-q
[j
].x
);
b1
=(q
[i
].x
*q
[i
].y1
-q
[i
].x1
*q
[i
].y
)/(q
[i
].x
-q
[i
].x1
);
b2
=(q
[j
].x
*q
[j
].y1
-q
[j
].x1
*q
[j
].y
)/(q
[j
].x
-q
[j
].x1
);
if(k1
==k2
)
{continue;}
if((q
[i
].x
==q
[j
].x
&&q
[i
].y
==q
[j
].y
)||(q
[i
].x
==q
[j
].x1
&&q
[i
].y
==q
[j
].y1
)||(q
[i
].x1
==q
[j
].x
&&q
[i
].y1
==q
[j
].y
)||(q
[i
].x1
==q
[j
].x1
&&q
[i
].y1
==q
[j
].y1
))
{ans
++;
continue;}
mx
=min(q
[i
].x
,q
[i
].x1
);
mmx
=max(q
[i
].x
,q
[i
].x1
);
my
=min(q
[i
].y
,q
[i
].y1
);
mmy
=max(q
[i
].y
,q
[i
].y1
);
zx
=min(q
[j
].x
,q
[j
].x1
);
zzx
=max(q
[j
].x
,q
[j
].x1
);
zy
=min(q
[j
].y
,q
[j
].y1
);
zzy
=max(q
[j
].y
,q
[j
].y1
);
if(mx
>zzx
||zx
>mmx
||my
>zzy
||zy
>mmy
)
{continue;}
double kk1
,kk2
;
kk1
=k1
*q
[j
].x
+b1
;
kk2
=k1
*q
[j
].x1
+b1
;
if(kk2
>q
[j
].y1
&&kk1
>q
[j
].y
|| kk2
<q
[j
].y1
&&kk1
<q
[j
].y
)
{continue;}
double pp1
,pp2
;
pp1
=k2
*q
[i
].x
+b2
;
pp2
=k2
*q
[i
].x1
+b2
;
if(pp2
>q
[i
].y1
&&pp1
>q
[i
].y
|| pp2
<q
[i
].y1
&&pp1
<q
[i
].y
)
{continue;}
ans
++;
}
}
printf("%d\n",ans
);
return 0;
}
之后一个星期可能不更博了,反正没人看。。。。 备考数字逻辑了,祝我考个好成绩吧! 加油哦