/* 果园里的树: 果园里的树排列成矩阵。它们的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; }