好几天没写博客啦,我们数字逻辑课程要考试了,现在的我还啥也不会哈哈,要从头开始复习,等俺考完数字逻辑,再更嘿嘿。
好吧,这次也要拿出八百年前写的代码了。。。
题意就是给你许多个两个点,这两个点构成一条线段,求线段相交的对数
两线段不会重合的
样例输入
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;
}
之后一个星期可能不更博了,反正没人看。。。。
备考数字逻辑了,祝我考个好成绩吧!
加油哦