首页 > 代码库 > POJ 2653
POJ 2653
开一个数组做成队列来搜索就好了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <algorithm> 6 using namespace std; 7 8 const int MAXN=100010; 9 10 typedef struct po{11 double x,y;12 }Point;13 struct e{14 Point start,end;15 }edge[MAXN],ss,ee;16 int n;17 double x1,y1,x2,y2;18 Point start,end;19 int que[MAXN*100];20 21 double multi(Point p1, Point p2, Point p0){22 return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);23 }24 25 bool slove(int k,int i){26 ss=edge[k]; ee=edge[i];27 if(max(ss.start.x,ss.end.x)>=min(ee.start.x,ee.end.x)&&28 max(ee.start.x,ee.end.x)>=min(ss.start.x,ss.end.x)&&29 max(ss.start.y,ss.end.y)>=min(ee.start.y,ee.end.y)&&30 multi(ee.start,ss.end,ss.start)*multi(ss.end,ee.end,ss.start)>0&&31 multi(ss.start,ee.end,ee.start)*multi(ee.end,ss.end,ee.start)>0){32 return true;33 }34 return false; 35 }36 37 int main(){38 int f,l;39 while(scanf("%d",&n)!=EOF){40 if(n==0) break; f=l=0;41 for(int i=1;i<=n;i++){42 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);43 start.x=x1; start.y=y1;44 end.x=x2; end.y=y2;45 edge[i].start=start; edge[i].end=end;46 if(i>1){47 int size=l-f;48 while(size--){49 int k=que[f++];50 if(!slove(k,i))51 que[l++]=k;52 }53 }54 que[l++]=i;55 }56 bool flag=false;57 printf("Top sticks:");58 while(f<l){59 int i=que[f++];60 if(!flag){61 printf(" %d",i);62 flag=true;63 }64 else{65 printf(", %d",i);66 }67 }68 printf(".\n");69 }70 return 0;71 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。