• poj3130& poj3335


    两题都是判断多边形的核。。直接套用模板。。

    code(poj3130):

      1 /*
      2    State:Accepted
      3    Time:2013-04-11 19:04:36
      4 */
      5 #include<iostream>
      6 #include<cstring>
      7 #include<cstdio>
      8 #include<cmath>
      9 #include<algorithm>
     10 #include<set>
     11 #define eps  1e-9
     12 #define maxn  210
     13 using namespace std;
     14 
     15 int ln, q[maxn], top,  bot, n, ord[maxn], T;
     16 double maxdist;
     17 struct point{double x, y; } p[maxn];
     18 struct line { 
     19              point a, b; 
     20              double angle; 
     21 } ;
     22 line l[maxn], l1[maxn];
     23 
     24 void add_line(double x1, double y1, double x2, double y2 ){
     25      l[ln].a.x = x1;
     26      l[ln].b.x = x2;
     27      l[ln].a.y = y1;
     28      l[ln].b.y = y2;
     29      l[ln].angle = atan2(y2 - y1, x2 - x1);  
     30      ord[ln] = ln;
     31      ++ln;
     32 }
     33 
     34 void init(){
     35     double x1 , y1, x2, y2, dd;
     36     for (int i =0;  i < n; ++i){
     37             scanf("%lf%lf",&x1, &y1);
     38             p[i].x = x1;
     39             p[i].y = y1;  
     40     }    
     41     ln = 0;
     42     p[n] = p[0];
     43     for (int i = 0; i < n; ++i){
     44         add_line(p[i].x,  p[i].y, p[i+1].x, p[i+1].y);
     45     }
     46         
     47 
     48 }
     49 
     50 int dblcmp(double k){
     51     if (fabs(k) < eps) return 0;
     52     return k > 0 ? 1 : -1;
     53 }
     54 
     55 double multi(point p0, point p1, point p2){
     56     return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);    
     57 }
     58 
     59 bool cmp(const int u, const int v){
     60      int d = dblcmp(l[u].angle - l[v].angle);
     61      if (d == 0) return dblcmp(multi(l[u].a, l[v].a,l[v].b)) > 0;
     62      return d < 0;
     63 }
     64 
     65 void get_point(line l1, line l2, point& p){
     66      double  dot1,  dot2;
     67      dot1 = multi(l2.a, l1.b, l1.a);
     68      dot2 = multi(l1.b, l2.b, l1.a);
     69      p.x = (l2.a.x * dot2 + l2.b.x * dot1) / (dot1 + dot2);
     70      p.y = (l2.a.y * dot2 + l2.b.y * dot1) / (dot1 + dot2);
     71 }
     72 
     73 bool judge(line l0, line l1, line l2){
     74      point p;
     75      get_point(l1, l2, p);
     76      return dblcmp(multi(p, l0.a , l0.b)) < 0;  
     77 }
     78 
     79 
     80 bool SAI(){
     81      sort(ord, ord + ln , cmp); 
     82      int i, j;
     83      for (i = 0, j = 0; i < ln; ++i)
     84          if (dblcmp(l[ord[i]].angle - l[ord[j]].angle) > 0)
     85              ord[++j] = ord[i];
     86      ln = j + 1;
     87      q[0] = ord[0];
     88      q[1] = ord[1]; 
     89      bot = 0; 
     90      top = 1;
     91      for (int i = 2; i < ln ; ++i){
     92          while (bot < top && judge(l[ord[i]], l[q[top - 1]], l[q[top]])) --top;
     93          while (bot < top && judge(l[ord[i]], l[q[bot + 1]], l[q[bot]])) ++bot;
     94          q[++top] = ord[i];         
     95      }
     96      while (bot < top && judge(l[q[bot]], l[q[top-1]], l[q[top]])) --top; 
     97      while (bot < top && judge(l[q[top]], l[q[bot+1]], l[q[bot]])) ++bot;
     98      if (top - bot >= 2) return 1;
     99      else return 0;
    100 }
    101 
    102 int main(){
    103     freopen("poj3130.in","r",stdin);
    104     freopen("poj3130.out","w",stdout);
    105     while (scanf("%d", &n) && n){
    106        init();
    107        if (SAI()) printf("1\n");
    108        else printf("0\n");
    109      }
    110     fclose(stdin); fclose(stdout);       
    111 }

    poj3335

      1 /*
      2   State:Accepted
      3   Time:2013-04-11 19:06:14
      4 */
      5 #include<iostream>
      6 #include<cstring>
      7 #include<cstdio>
      8 #include<cmath>
      9 #include<algorithm>
     10 #include<set>
     11 #define eps  1e-9
     12 #define maxn  210
     13 using namespace std;
     14 
     15 int ln, q[maxn], top,  bot, n, ord[maxn], T;
     16 double maxdist;
     17 struct point{double x, y; } p[maxn];
     18 struct line { 
     19              point a, b; 
     20              double angle; 
     21 } ;
     22 line l[maxn], l1[maxn];
     23 
     24 void add_line(double x1, double y1, double x2, double y2 ){
     25      l[ln].a.x = x1;
     26      l[ln].b.x = x2;
     27      l[ln].a.y = y1;
     28      l[ln].b.y = y2;
     29      l[ln].angle = atan2(y2 - y1, x2 - x1);  
     30      ord[ln] = ln;
     31      ++ln;
     32 }
     33 
     34 void init(){
     35     double x1 , y1, x2, y2, dd;
     36     scanf("%d", &n);
     37     for (int i =0;  i < n; ++i){
     38             scanf("%lf%lf",&x1, &y1);
     39             p[i].x = x1;
     40             p[i].y = y1;  
     41     }    
     42     ln = 0;
     43     p[n] = p[0];
     44     for (int i = 0; i < n; ++i){
     45         add_line(p[i+1].x,  p[i+1].y, p[i].x, p[i].y);
     46     }
     47         
     48 
     49 }
     50 
     51 int dblcmp(double k){
     52     if (fabs(k) < eps) return 0;
     53     return k > 0 ? 1 : -1;
     54 }
     55 
     56 double multi(point p0, point p1, point p2){
     57     return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);    
     58 }
     59 
     60 bool cmp(const int u, const int v){
     61      int d = dblcmp(l[u].angle - l[v].angle);
     62      if (d == 0) return dblcmp(multi(l[u].a, l[v].a,l[v].b)) > 0;
     63      return d < 0;
     64 }
     65 
     66 void get_point(line l1, line l2, point& p){
     67      double  dot1,  dot2;
     68      dot1 = multi(l2.a, l1.b, l1.a);
     69      dot2 = multi(l1.b, l2.b, l1.a);
     70      p.x = (l2.a.x * dot2 + l2.b.x * dot1) / (dot1 + dot2);
     71      p.y = (l2.a.y * dot2 + l2.b.y * dot1) / (dot1 + dot2);
     72 }
     73 
     74 bool judge(line l0, line l1, line l2){
     75      point p;
     76      get_point(l1, l2, p);
     77      return dblcmp(multi(p, l0.a , l0.b)) < 0;  
     78 }
     79 
     80 
     81 bool SAI(){
     82      sort(ord, ord + ln , cmp); 
     83      int i, j;
     84      for (i = 0, j = 0; i < ln; ++i)
     85          if (dblcmp(l[ord[i]].angle - l[ord[j]].angle) > 0)
     86              ord[++j] = ord[i];
     87      ln = j + 1;
     88      q[0] = ord[0];
     89      q[1] = ord[1]; 
     90      bot = 0; 
     91      top = 1;
     92      for (int i = 2; i < ln ; ++i){
     93          while (bot < top && judge(l[ord[i]], l[q[top - 1]], l[q[top]])) --top;
     94          while (bot < top && judge(l[ord[i]], l[q[bot + 1]], l[q[bot]])) ++bot;
     95          q[++top] = ord[i];         
     96      }
     97      while (bot < top && judge(l[q[bot]], l[q[top-1]], l[q[top]])) --top; 
     98      while (bot < top && judge(l[q[top]], l[q[bot+1]], l[q[bot]])) ++bot;
     99      if (top - bot >= 2) return 1;
    100      else return 0;
    101 }
    102 
    103 int main(){
    104     freopen("poj3335.in","r",stdin);
    105     freopen("poj3335.out","w",stdout);
    106     scanf("%d",&T);
    107     for (int i =1; i <= T; ++i){
    108        init();
    109        if (SAI()) printf("YES\n");
    110        else printf("NO\n");
    111      }
    112     fclose(stdin); fclose(stdout);       
    113 }
  • 相关阅读:
    工作中的几个问题
    linux初学之二
    VMWARE虚拟机卡死
    记昨天、今天的部分工作内容及问题
    linux初学之一
    今日阅读项目源码
    python POST XML
    python的超简单WEB服务器
    在notepad++中运行python
    安装python图形库:Matplotlib
  • 原文地址:https://www.cnblogs.com/yzcstc/p/3015795.html
Copyright © 2020-2023  润新知