算法竞赛入门经典:第五章 基础题目选解 5.11果园里的树

/*
果园里的树:
果园里的树排列成矩阵。它们的x和y坐标均是1~99的整数。输入若干个三角形,依次统计每一个三角形内部和边界上共有多少棵树,如图所示。
8	.	.	.	.	.	.	.	.	.	.	.	.	.	.	.
7	.	.	.	.	.	.	.	.	.	.	.	.	.	.	.
6	.	.	.	.	.	.	.	.	.	.	.	.	.	.	.
5	.	.	.	.	.	.	.	.	.	.	.	.	.	.	.
4	.	.	.	.	.	.	.	.	.	.	.	.	.	.	.
3	.	.	.	.	.	.	.	.	.	.	.	.	.	.	.
2	.	.	.	.	.	.	.	.	.	.	.	.	.	.	.
1	.	.	.	.	.	.	.	.	.	.	.	.	.	.	.
0   1	2	3	4	5	6	7	8	9	10	11	12	13	14	15

输入:
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

关键:
确认一个点是否在三角形内




*/

/*
1三角形面积公式2A=|x0 y0 1|
                  |x1 y1 1|
				  |x2 y2 1|
				  三个顶点逆时针排列,有向面积为正,三点共线,面积为0
2 判断一个顶点O是否在三角形内部用Sabc = Soab + Sobc + Soca
3 判断浮点数a,b是否相等:fabs(a-b) <= 1e-9
4 对每个点判断是否属于三角形,从O点分出的三个三角形按oab,obc,oca顺序得到的结果与原来的大三角形Sabc同号或为0
5 没能做出来
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define X 99
#define Y 99

double treeArea(double x0,double y0,double x1,double y1,double x2,double y2)//关键求每个小三角形面积Soab,Sobc,Soca有先后顺序,并且只需调用这个函数即可
{
	double dSabc = x0*y1 + x2*y0 + x1*y2 - x0*y2 - x1*y0 - x2*y1;
	return dSabc;
	//double iSoab = fabs(x*y1 + x2*y + x1*y2 - x*y2 - x1*y - x2*y1);
	//double iSobc = fabs(x0*y + x2*y0 + x*y2 - x0*y2 - x*y0 - x2*y);
	//double iSoca = fabs(x0*y1 + x*y0 + x1*y - x0*y - x1*y0 - x*y1);
	//double iTotal = iSoab + iSobc + iSoca;
	//if(fabs(iSabc - iTotal) < 1e-9)
	//{
		//return true;
	//}
	//else
	//{
		//return false;
	//}
}

int treeNum(double x0,double y0,double x1,double y1,double x2,double y2)
{
	int iCount = 0;
	double dSabc = treeArea(x0,y0,x1,y1,x2,y2);
	for(int i = 1 ; i <= X ;i++)
	{
		for(int j = 1;j <= Y;j++)
		{
			double ii = i*1.0,jj = j*1.0;
			double dSoab = treeArea(ii,jj,x0,y0,x1,y1);//注意Soab,表明o作为第一个节点,因为求得是有向面积,前后有先后顺序
			double dSobc = treeArea(ii,jj,x1,y1,x2,y2);
			double dSoca = treeArea(ii,jj,x2,y2,x0,y0);
			double dTotal = dSoab + dSobc + dSoca;
			//if(fabs(dSabc - dTotal) <= 1e-9)
			//{
			//	iCount++;
			//}
			/*
			if(dSabc >= 0 = 0 =0 = 0)
			{
				iCount++;
			}
			else if(dSoab <= 0 = 0 = 0 =0)
			{
				iCount++
			}
			*/
			if(dSabc*dSoab >=0 && dSabc*dSobc >= 0 && dSabc*dSoca >= 0)
			{
				iCount++;
			}
		}
	}
	return iCount;
}

int main(int argc,char* argv[])
{
	double x0,y0,x1,y1,x2,y2;
	while(EOF != scanf("%f %f %f %f %f %f",&x0,&y0,&x1,&y1,&x2,&y2))
	{
		printf("%d",treeNum(x0,y0,x1,y1,x2,y2));
	}
	system("pause");
	return 0;
}
















你可能感兴趣的:(算法竞赛)