果园里的树
来源:互联网 发布:网络交友的利与弊观点 编辑:程序博客网 时间: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;
}
唔,到此结束。。完工。。。如果有错,请指出。。。。代码我粘贴的,偷懒了。。。。
- 果园里的树
- 果园里的树
- 果园里的树
- 果园里的树
- 果园里的树
- 果园里的树
- 果园里的树
- 果园里的树
- 例题5.4.3,果园里的树
- 经典算法之果园里的树
- 算法入门之果园里的树
- 算法竞赛 之果园里的树
- 果园里的果树
- 果园里的快乐时光
- 算法实践之4 :果园里的树
- 算法竞赛入门经典 5.4.3果园里的树
- 算法入门经典——果园里的树
- [英语阅读]果园里的金子
- android开发——popupwindow
- java 放大缩小图片
- 【mysql】Mysql 5.1.46开启InnoDB引擎
- codeforces 330c
- 第一节 常用组件 之 Lookup 概述
- 果园里的树
- Unity shader 写一个垃圾的 黄金shader
- 将你的cocos程序编译成Android程序
- Hibernate 与 Spring简单集成
- 输入一行字符,统计其中有多少个单词,单词之间用空格分开
- JAVAScript 中的保留字
- java枚举使用详解
- 苹果虚拟机安装教程
- 表达式之谜