程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 2653 Pick-up sticks--線段相交--vector

poj 2653 Pick-up sticks--線段相交--vector

編輯:C++入門知識

[cpp]
/*
題意:隨即扔一些棒子,輸出在最上面的棒子(沒有那個棒子壓著它)的編號
 
線段相交問題
 
本體用到了  vector    
注意    v.erase(remove_if(v.begin(),v.end(),ok),v.end());  用法
同時    v.erase  返回的是刪除過後,下一個元素的位置,不要再for裡面用 it++  在循環裡面自己操作
*/ 
#include<stdio.h>  
#include<vector>  
#include<algorithm>  
using namespace std; 
const double esp=1e-8; 
struct point 

    double x,y; 
};  
struct node 

    point p1,p2; 
    int no; 
}; 
vector<node>v; 
int n; 
node cc; 
double max(double a,double b){return a>b?a:b;} 
double min(double a,double b){return a<b?a:b;} 
double cross(point p,point s,point e) 

    return (e.x-s.x)*(p.y-s.y)-(p.x-s.x)*(e.y-s.y); 

bool segintersect(point s1,point e1,point s2,point e2) 

    return((max(s1.x,e1.x)>=min(s2.x,e2.x))&& 
        (max(s2.x,e2.x)>=min(s1.x,e1.x))&& 
        (max(s1.y,e1.y)>=min(s2.y,e2.y))&& 
        (max(s2.y,e2.y)>=min(s1.y,e1.y))&& 
        (cross(s1,s2,e2)*cross(e1,s2,e2)<=esp)&& 
        (cross(s2,s1,e1)*cross(e2,s1,e1)<=esp));  

bool ok(node n) 

    if(segintersect(n.p1,n.p2,cc.p1,cc.p2)) 
        return true; 
    return false; 

int main() 

    int i; 
    while(scanf("%d",&n),n) 
    { 
        v.erase(v.begin(),v.end()); 
        for(i=1;i<=n;i++) 
        { 
            scanf("%lf%lf%lf%lf",&cc.p1.x,&cc.p1.y,&cc.p2.x,&cc.p2.y); 
            cc.no=i; 
            v.erase(remove_if(v.begin(),v.end(),ok),v.end()); 
            v.push_back(cc); 
        } 
        printf("Top sticks: "); 
        for(vector<node>::iterator it = v.begin(); it!= v.end(); it++) 
        { 
            printf("%d",it->no); 
            if(it!=v.end()-1) 
                printf(", "); 
            else printf(".\n"); 
        } 
    } www.2cto.com
    return 0; 


作者:qq172108805

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved