Pick-up Sticks- 解析几何-点在直线左中右

Pick-up Sticks

描述

Stan有n根棍子,他一次一根地将棍子随机地扔在地板上,然后,Stan试图找到在最上面的棍子,也就是没有其他的棍子压在这样的棍子上面,Stan已经注意到,最后扔出的棍子总在最上面,但他想知道所有在最上面的棍子。

输入

首先给出棍子总数n, 1<=n<=100000,接下来是n行,每行4个数,表示每根棍子左右端点的坐标,棍子列表的顺序是Stan扔棍子的顺序。n=0时表示结束。

输出

对每组测试用例,输出一行在最上面的棍子列表,列表顺序按扔棍子的顺序。

#include<iostream>
#define value 1e-8
#define LEFT -1
#define RIGHT 1
#define IN 0
#define N 100000
using namespace std;

typedef struct {
	double x;
	double y;
}point;

typedef struct {
	point left;
	point right;
}Stick;

int isDirection(Stick a,point b){
	double sum;
	sum=(a.right.y-a.left.y)*b.x+(a.left.x-a.right.x)*b.y+(a.right.x*a.left.y-a.left.x*a.right.y);
	if(sum<-value) return LEFT;
	else if(sum>value) return RIGHT;
	else return IN;
}

int isCross(Stick a,Stick b){
	int isValue1,isValue2;
	isValue1=isDirection(a,b.left)*isDirection(a,b.right);
	isValue2=isDirection(b,a.left)*isDirection(b,a.right);
	
	if(isValue1*isValue2<0) return 0;
	else if(isValue1*isValue2>0){
		if(isValue1<0&&isValue2<0) return 1;
		else return 0;
	}
	else if(isValue1*isValue2==0){
		if(isValue1==0&&isValue2==0) return 1;
		else return 0;
	}
}

int main(){
	int n,i,j,t,k,*top;
	Stick *stick;
	cin>>n;
	
	while(n!=0){
		stick = new Stick[n];
		top = new int[n];
		k=0;
		
		for(i=0;i<n;i++){
			cin>>stick[i].left.x>>stick[i].left.y>>stick[i].right.x>>stick[i].right.y;
		}
		
		for(i=0;i<n;i++){
			t=0;
			for(j=i+1;j<n;j++){
				t=isCross(stick[i],stick[j]);
				if(t) break;
			}
			if(t==0) top[k++]=i+1;	
		}
		
		cout<<"Top sticks:";
		for(i=0;i<k;i++){
			cout<<" "<<top[i];
			if(i+1<k) cout<<",";
		}
		cout<<"."<<endl;
		
		delete []stick;
		delete []top;
		
		cin>>n;
	}
	
	return 0;
} 

唯一觉得牛逼的地方是:isCross函数体

        利用双重检索棍a和棍b的相交关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值