POJ 2653 Pick-up sticks
2013-04-18 12:17
351 查看
链接点击:POJ 2653 Pick-up sticks
一道依靠纯粹暴力就可以过得简单题。
一道依靠纯粹暴力就可以过得简单题。
#include<stdio.h> #include<string.h> #include<math.h> #define eps 1e-6 const int MAXN=100002; bool vis[MAXN]; typedef struct { double x,y; }Point; Point p1[MAXN],p2[MAXN]; int dblcmp(double x) { if(fabs(x)<eps) return 0; return x>0?1:-1; } double det(double x1,double y1,double x2,double y2) { //求叉积 return x1*y2-x2*y1; } double cross(Point a,Point b,Point c) { return det(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y); } bool segcross(Point a,Point b,Point c,Point d) { int d1,d2,d3,d4; d1=dblcmp(cross(a,b,c)); d2=dblcmp(cross(a,b,d)); d3=dblcmp(cross(c,d,a)); d4=dblcmp(cross(c,d,b)); if((d1^d2)==-2&&(d3^d4)==-2) return true; return false; } int main() { int n,i,j; while(scanf("%d",&n),n) { memset(vis,true,sizeof(vis)); for(i=1;i<=n;i++) scanf("%lf%lf%lf%lf",&p1[i].x,&p1[i].y,&p2[i].x,&p2[i].y); for(i=1;i<=n;i++) for(j=n;j>=i+1;j--)//只能倒着遍历,否则会超时,因为后面压前面的概率大,所以从后开始找更加省时。 if(segcross(p1[i],p2[i],p1[j],p2[j]))//判断线段是否相交 { vis[i]=false; break; } printf("Top sticks: "); for(i=1;i<n;i++) if(vis[i]) printf("%d, ",i); printf("%d.\n",n); } return 0; }
相关文章推荐
- 【POJ 2653】Pick-up sticks 判断线段相交
- POJ2653(Pick-up sticks)(线段相交问题)
- poj2653-Pick-up sticks
- poj 2653 Pick-up sticks
- POJ 2653 Pick-up sticks
- POJ 2653 Pick-up sticks
- POJ 2653 Pick-up sticks(判断线段相交)
- POJ_2653_Pick-up sticks_判断线段相交
- POJ 2653 Pick-up sticks [线段相交 迷之暴力]
- POJ 2653 Pick-up sticks (判断线段相交)
- poj 2653 Pick-up sticks【线段相交】
- poj 2653 Pick-up sticks (线段交)
- poj 2653 Pick-up sticks 线段相交判断
- 【POJ】2653 Pick-up sticks(计算几何基础+暴力)
- POJ 2653 Pick-up sticks (判断线段相交)
- POJ 2653 Pick-up sticks
- POJ 2653 Pick-up sticks
- 【poj 2653】 Pick-up sticks 线段相交
- zoj 2551 || poj 2653 Pick-up sticks
- poj 2653 Pick-up sticks