zoukankan      html  css  js  c++  java
  • Vjudge

    2017-07-15 22:29:06

    •   writer:pprp
    • 评价,用到了叉乘,很麻烦,C++构造知识必须扎实
    • 题目如下:
    • 我们用逆时针方向的顶点序列来表示,我们很想了解这块地的基本情况,现在请你编程判断HDU的用地是凸多边形还是凹多边形呢? 
      Input输入包含多组测试数据,每组数据占2行,首先一行是一个整数n,表示多边形顶点的个数,然后一行是2×n个整数,表示逆时针顺序的n个顶点的坐标(xi,yi),n为0的时候结束输入。 
      Output对于每个测试实例,如果地块的形状为凸多边形,请输出“convex”,否则输出”concave”,每个实例的输出占一行。 
      Sample Input
      4
      0 0 1 0 1 1 0 1
      0
      Sample Output
      convex
    • 
      

       代码如下;

    • #include <iostream>
      
      using namespace std;
      
      class point
      {
      public:
          int x;
          int y;
          point(int a,int b):x(a),y(b) {}
          point():x(0),y(0) {}
          void change(int a,int b)
          {
              x = a;
              y = b;
          }
      };
      
      class vec
      {
      public:
          point a;
          point b;
          point pos;
          point nag;
          vec():a(point(0,0)),
              b(point(0,0)),pos(),nag() {}
          vec(point &aa,point&bb):
              a(aa),b(bb),pos(b.x-a.x,b.y-a.y),nag(a.x-b.x,a.y-b.y) {}
          void change(point & aa,point &bb)
          {
              a.x = aa.x;
              a.y = aa.y;
              b.x = bb.x;
              b.y = bb.y;
      
              pos.x = b.x-a.x;
              pos.y = b.y-a.y;
              nag.x = a.x-b.x;
              nag.y = a.y-b.y;
          }
      };
      
      int chacheng(vec val1,vec val2)
      {
         
          if( (val1.nag.x * val2.pos.y-val1.nag.y*val2.pos.x)> 0)
          {
      
              return 1;
          }
          else
              return 0;
      }
      
      int main()
      {
          int num;
          int a,b;
      
          while(cin >> num && num!=0)
          {
              point *po = new point[num];
              vec *ve = new vec[num];
              for(int i = 0 ; i < num ; i++)
              {
                  cin >> a >> b;
                  po[i].change(a,b);
              }
              for(int i = 0 ; i < num ; i++)
              {
                  if(i != num-1)
                      ve[i].change(po[i],po[i+1]);
                  else
                      ve[i].change(po[i],po[0]);
              }
              int cnt = 0;
              for(int i = 0 ; i < num ; i++)
              {
      
                  if(i == num-1)
                  {
                      if(chacheng(ve[i],ve[0])==1)
                      {
                          cnt++;
                      }
                  }
                  else
                  {
                      if(chacheng(ve[i],ve[i+1])==1)
                      {
                          cnt++;
                      }
                  }
              }
              if(cnt == 0 || cnt == num)
              {
                  cout << "convex" << endl;
              }
              else
              {
                  cout << "concave"<<endl;
              }
          }
          return 0;
      }
  • 相关阅读:
    MathType编辑半直积符号的步骤
    用几何画板演示涡旋电场的方法
    MathType编辑双向斜箭头的教程
    最实用的几何画板绘图技巧大总结
    怎么让Word编辑公式又快又好
    在几何画板中作三角形高的方法
    MathType中输入破折号的教程
    几何画板5.06最强中文版破解-下载-注册码
    如何通过几何画板来验证海伦公式
    如何用公式编辑器编辑直角三角形符号
  • 原文地址:https://www.cnblogs.com/pprp/p/7187961.html
Copyright © 2011-2022 走看看