果园里的树

来源:互联网 发布:网络交友的利与弊观点 编辑:程序博客网 时间:2024/04/25 22:57

这是《算法入门经典》(刘汝佳)版中的题目

题目:  果园里的树

 

果园里的树排列成矩阵。他们的x和y的坐标均是1~99的整数。输入若干个三角形,依次统计每个三角形内部和边界上共有多少棵树。

输入:

1.5  1.5       1.5  6.8      6.8  1.5

10.7  6.9     8.5  1.5      14.5  1.5

 

在此之前我们应该明确一个东西:

在一个三角形ABC中存在一点O,O点与三角形ABC的三个顶点A B c的连线将三角形分成三个部分,并且有Sabc=Soab+Sobc+Sobc;

 

在该题中我们的目的是要判断三角形所围的点有多少个,那现在我们不难得出答案,我们只需要将点代入计算,看看点是否满足即可。

 

我们需要用到三角形的有效面积来进行求解,(额。。。。我的有向面积的贴还在审核,好了再贴)

 

有向面积的函数:

<code>

double area(double x0,double y1,double x1,double y1,double x2,double y2){

      return x0*y1+x2*y0+x1*y2-x0*y2-x1*y0-x2*y1;

}

</code>

 

判断点p是否在三角形内部或者是边界上的方法是:O点分出的三个三角形按oab,obc,oca的顺序得到的结果与原来的大三角形Sabc的同号或为0。

 

#include <stdio.h>
#include <math.h>
#define inf 1e-10 //记住判断小于零是判断它小于某个很小很小的值,不是0,一般是1e-6.

//有向面积函数

double area2(double x0,double y0,double x1,double y1,double x2,double y2)
{
 return fabs(x0*y1+x2*y0+x1*y2-x2*y1-x0*y2-x1*y0);
}

//不解释这个啦,看得懂

double min(double a,double b)
{
 return a<b?a:b;
}
double max(double a,double b)
{
 return a>b?a:b;
}

 


int main()
{
 int i,j,count;
 double x0,x1,x2,y0,y1,y2,s0,s1,s2,s3;
 double minX,maxX,minY,maxY;

/*不要忘了读取时加取地址符号,我被害惨了*/
 while(scanf("%lf%lf%lf%lf%lf%lf",&x0,&y0,&x1,&y1,&x2,&y2)!=EOF)
 {

  //该段的目的是获取一个三角形所在平面区间,减少多余运算
  minX=min(x0,min(x1,x2));minY=min(y0,min(y1,y2));
  maxX=max(x0,max(x1,x2));maxY=max(y0,max(y1,y2));
  count=0;
   for(i=minX;i<=maxX;i++)
     for(j=minY;j<=maxY;j++)
      {
       s0=area2(x0,y0,x1,y1,x2,y2);
       s1=area2(i,j,x0,y0,x1,y1);
       s2=area2(i,j,x1,y1,x2,y2);
       s3=area2(i,j,x2,y2,x0,y0);
       if(fabs(s0-s1-s2-s3)<inf)
           count++;
   }
  printf("%d\n",count);
 }
 return 0;
}

 唔,到此结束。。完工。。。如果有错,请指出。。。。代码我粘贴的,偷懒了。。。。

0 0
原创粉丝点击