白书 5.4.3 果园的里的树

果园里的树排列成矩阵。他们的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

此题用三角形有向面积来解,求有向面积2倍的函数为:

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

若求其面积,即没有方向的:则为fabs(S)/2;

可以用行列式来记住这个式子:

  |x0  y0  1|

2S=|x1  y1  1|=x0*y1+x2*y0+x1*y2-x2*y1-x0*y2-x1*y0;          // 这个以前还不太明白 现在懂了

  |x2  y2  1|                           //应该就是叉积 不过经过化简后更好记了 为点排列为逆时针方向

若三角形三个点按逆时针排列,则有向面积为正,否则为负。

对一个三角形ABC和平面上任意一点O:都有            Sabc=Soab+Sobc+Soca;       // 关键技巧在此

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

代码为:

#include<iostream>
using namespace std;
double area(double x0,double y0,double x1,double y1,double x2,double y2)
{
    return x0*y1+x2*y0+x1*y2-x0*y2-x1*y0-x2*y1;
}
int main()
{
    double x0,y0,x1,y1,x2,y2,m,n;
    while(cin >> x0 >> y0 >> x1 >> y1 >> x2 >> y2)
    {
        int count = 0;
        int i,j;
        double s0,s1,s2,s3;
        for(i=1;i<100;i++)
         for(j=1;j<100;j++)
         {
             m=i*1.0;
             n=j*1.0;
             s0=area(x0,y0,x1,y1,x2,y2);
             s1=area(m,n,x0,y0,x1,y1);
             s2=area(m,n,x1,y1,x2,y2);
             s3=area(m,n,x2,y2,x0,y0);        if(s0 == s1 + s2 + s3)          count++;

         }
         cout << count << endl;
    }

    return 0;
}

白书 5.4.3 果园的里的树,布布扣,bubuko.com

时间: 2025-01-18 15:57:32

白书 5.4.3 果园的里的树的相关文章

Uva10474-STL水题-白书

白书的一道水题.话说好久没认真做难题了.今天出了排名,所有队伍里倒数第一啊! 代码没什么可说的了. #include <algorithm> #include <cstring> #include <ctype.h> #include <cstdlib> #include <cstdio> #include <vector> #include <string> #include <queue> #include

6.12白书第五章图论总结——司雨寒

之前我的图论一直都是DFS一下,BFS一下,求个欧拉回路,拓扑排个序这种渣渣水平. 终于鼓起勇气拾起白书第五章的东西. 学(bei)习(song)了一下求双连通分量,二分图的判定,强连通分量,2-SAT. DFS加上时间戳这个东西,很强大. 最后刷了白书上的例题: BCC: LA3523 可以参加会议的是双联通分量上的奇圈 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include

白书 5.4.4 多少块土地

此题初识欧拉公式 V - E + F = 2. 其中V是顶点(即所有线段的断点数加上交点数),E是边数(即n段椭圆弧加上这些线段被切成的段数),F是面数(即土地块数加上椭圆外那个无穷大的面). ------------------------------------------------------------------------------------------------------- 有一块椭圆的地,你可以在边界上选n个点,并两两连接得到n(n-1)/2条线段.它们最多能把土地分成

算法篇——果园里的树

来源:<算法竞赛入门经典>例题5.4.3 题目:果园里的树排列成矩阵.它们的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 样例输出: 15 17 分析: 三角形的有向面积: double area2(double x0,double y0,double x1,double y1,double x2,double y2) { retur

白书 第九章 例 9.24 复制书稿 题解

题目解法: 题解 白书 第九章 例 9.24 复制书稿 题解,码迷,mamicode.com

分数化小数(decimal) 白书习题 2-5

1 /* 2 分数化小数(decimal) 白书习题 2-5 3 输入正整数 a , b , c , 输出 a/b 的小数形式,精确到小数点后 c 位 .a,b<=10^6 , c <= 100. 4 输入包含多组数据,结束标志为 a = b = c = 0 ; 5 */ 6 #include<stdio.h> 7 int main() 8 { 9 int a,b,c,y; //y用来存储 a/b 的余数 10 while(scanf("%d%d%d",&

白书 - 拓扑排序 及 关于递归、coding的一些思考

题目:有n个变量,m个二元组(u,v),表示变量u小于变量v.将所有变量从小到大排列,给出满足条件的一个. 思路:把"小于"关系看成有向边,得到一个有向图.任务就是把一个图的所有结点排序,使得每一条有向边(u,v)对应的 u 都排在 v 的前面.在图论中,这个问题称为拓扑排序topological sort.  不难发现:如果图中存在有向环,则不存在拓扑排序的解,反之则存在.我们把不包含有向环的有向图称为有向无环图(Directed Acyclic Graph,DAG). 以下是补充了

la3523 白书例题 圆桌骑士 双联通分量+二分图

具体题解看大白书P316 #include <iostream> #include <algorithm> #include <vector> #include <string.h> #include <stack> #include <cstdio> using namespace std; struct Edge{int u,v;}; const int maxn = 1000+10; int pre[maxn],iscut[ma

白书_倒三角形_C语言描述

#include<stdio.h> int main() { int n,t,i,j; scanf("%d",&n); for(i=0; i<=n-1; i++) { t = 2*n - 1- 2*i; for(j=0; j<i; j++) { printf(" "); } while(t) { printf("#"); t--; } printf("\n"); } return 0; }