您的位置:首页 > 其它

UVaOJ 143 Orchard Trees

2013-09-21 11:34 267 查看
题目大意:果园里的树排列成矩阵,它们的x和y坐标均是1~99的整数。输入若干三角形,依次统计每一个三角形内部和边界上共有多少棵树。这个题目似乎与高中的解析几何几何有关系,但是若把它当做解析几何来做,就会在无形中增加题目的难度。换个思路,假设三角形ABC,若一个点O在三角形ABC中,则必有S-ABC=S-OAB+S-OAC+S-OBC,变成面积关系即可。



1#include<cstdio>
2#include<cmath>
3#include<algorithm>
4usingnamespacestd;
5#defineEPS1e-9
6
7doublearea2(doublex0,doubley0,doublex1,doubley1,doublex2,doubley2)
8{
9returnfabs(x0*y1+x2*y0+x1*y2-x2*y1-x0*y2-x1*y0);//这里利用了三阶行列式,求出的值是有向三角形面积的2倍
10}
11
12intmain()
13{
14#ifdefLOCAL
15freopen("in","r",stdin);
16#endif
17doublex1,x2,x3,y1,y2,y3;
18while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF)
19{
20if((x1||x2||x3||y1||y2||y3)==0)break;
21intx_min=ceil(min(x1,min(x2,x3)));//ceil函数用来返回不小于参数的最小整数
22x_min=max(1,x_min);
23intx_max=max(x1,max(x2,x3));
24x_max=min(99,x_max);
25inty_min=ceil(min(y1,min(y2,y3)));
26y_min=max(1,y_min);
27inty_max=max(y1,max(y2,y3));
28y_max=min(99,y_max); //以上代码用来缩减后续遍历的范围
29doubleS=area2(x1,y1,x2,y2,x3,y3);
30intans=0;
31for(intx=x_min;x<=x_max;x++)
32for(inty=y_min;y<=y_max;y++)
33{
34doubleS1=area2(x1,y1,x2,y2,x,y);
35doubleS2=area2(x2,y2,x3,y3,x,y);
36doubleS3=area2(x3,y3,x1,y1,x,y);
37if(fabs(S-S1-S2-S3)<EPS)ans++;
38}
39printf("%4d\n",ans);
40}
41return0;
42}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: