zoj1010 Area

原创 2006年06月16日 13:31:00
  1. //zoj1010 Area

  2. //Accepted 1010 C++ 00:00.09 412K 

  3. #include <stdio.h>

  4. #include <math.h>

  5. #define MAXN 1000

  6. struct point{   double x,y; } p[MAXN];

  7. int n;

  8. double xmult(double x1,double y1,double x2,double y2){return x1*y2-x2*y1;}

  9. double xmult3(double x1,double y1,double x2,double y2,double x3,double y3){

  10.        return (x1-x3)*(y2-y3)-(x2-x3)*(y1-y3);

  11. }

  12. //判点p1p2在线段p3p4同侧

  13. bool same_side(point p1,point p2,point p3,point p4)

  14. {

  15.        double dx,dy,dx1,dy1,dx2,dy2;

  16.        dx = p4.x-p3.x, dy = p4.y-p3.y;

  17.        dx1 = p1.x-p3.x, dy1 = p1.y-p3.y;

  18.        dx2 = p2.x-p4.x, dy2 = p2.y-p4.y;

  19.        return xmult(dx,dy,dx1,dy1)*xmult(dx,dy,dx2,dy2)>0.0;

  20. }

  21. //p1p2p3p4相交

  22. bool intersect(point p1,point p2,point p3,point p4)

  23. {

  24.        return (!same_side(p1,p2,p3,p4) && !same_side(p3,p4,p1,p2));

  25. }

  26.  

  27. double area_polygon()

  28. {

  29.        int i;

  30.        double s1=0,s2=0;

  31.        for (i=0; i<n; ++i){

  32.               s1 += p[(i+1)%n].y*p[i].x;

  33.               s2 += p[(i+1)%n].y*p[(i+2)%n].x;

  34.        }

  35.        return fabs(s1-s2)/2;

  36. }

  37.  

  38. void solve()

  39. {

  40.        int i,j,k;

  41.        for (i=0; i<n; ++i)

  42.               scanf ("%lf %lf",&p[i].x,&p[i].y);

  43.        if (n<3){

  44.               printf ("Impossible/n");

  45.               return ;

  46.        }

  47.        for (i=0; i<n; ++i)

  48.               for (j=(i+1)/n; j<i-1; ++j){

  49.                      k = (i+1)%n;

  50.                      if (intersect(p[i],p[k],p[j],p[j+1])){

  51.                             printf ("Impossible/n");

  52.                             return ;

  53.                      }

  54.               }

  55.        printf ("%.2lf/n",area_polygon());

  56. }

  57.  

  58. int main()

  59. {

  60. #ifdef ONLINE_JUDGE

  61. #else

  62.        freopen("1010.txt","r",stdin);

  63. #endif

  64.        int t=0;

  65.        while (scanf ("%d",&n) != EOF && n){

  66.               if (t) printf ("/n");

  67.               printf ("Figure %d: ",++t);

  68.               solve();

  69.        }

  70. #ifdef ONLINE_JUDGE

  71. #else

  72.        fclose(stdin);

  73. #endif

  74.        return 0;

  75. }

zoj 1010 Area【线段相交问题】

ACM 计算几何 线段相交问题

ZOJ 1010 Area(判定线段是否构成多边形)

ZOJ 1010 Area(判定线段是否构成多边形) http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1010 题意: ...

浙大ZOJ 1010 Area问题解决

一、工程代码及算法设计注释 --------------------------------------------------area.h-----------------------------...

ZOJ--1010:Area(线段判交问题)

Area Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Jerry, a middle...
  • yf224
  • yf224
  • 2017年06月19日 19:11
  • 214

ZOJ 1010 Area (判线段相交,简单多边形的面积)

首先要判断出不合法的多边形(impossible),即与非邻边有交点的多边形,或者n 第二就是计算简单多边形面积,计算方法就是计算每点和左右点对X轴的三角形面积(输入点要按逆时针排列,否则计算结果为...

zoj 1010 Area 判断线段是否相交(把线段扩充一倍后 好处理) + 多边形求面积

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=10   题意:  给定n个点的, 如果这n个点不能形成多边形 ...

zoj 1010 Area (求面积 叉积)

 Jerry, a middle school student, addicts himself to mathematical research. Maybe the problems he has...

ZOJ1010 Area (Asia 2001, Shanghai,计算几何)

题目大意是,给出一些点,这些点按顺序连接边,是否能围成一个多边形,能的话,输出多边形的面积,否则就输出不能。相信多数 WA  的盆友都和我一样是错在多边形判断那个环节了,题目说的不是太清楚,经测试,以...

zoj1010——Area

题意:求判断能否组成多边行,如果可以,求其面积。思路:利用排斥和跨立判断是否线段相交;求面积的话,用到测量师公式。http://episte.math.ntu.edu.tw/articles/sm/s...

zoj 1439 Area Ratio

/* 数学题 套公式就行 */ #define LOCAL #include #include #include #include #include #include #include #includ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:zoj1010 Area
举报原因:
原因补充:

(最多只允许输入30个字)