mathe 发表于 2018-3-27 22:34:46

三角形计数

我女儿的数学题,以三乘五单位网格(边长为2*4的长方形分割为单位正方形)中格点为顶点的三角形中有多少个面积为三。我数来数去24个,可是标准答案是28,感觉答案有问题,和大家求证一下

KeyTo9_Fans 发表于 2018-3-27 22:57:05

答案是28
#include<cmath>
#include<cstdio>

double d(int x,int y)
{
        return sqrt(x*x+y*y);
}

int main()
{
        int i,j,k,s=0;
        for(i=0;i<13;i++)
                for(j=i+1;j<14;j++)
                        for(k=j+1;k<15;k++)
                        {
                                int ix=i/5,iy=i%5,jx=j/5,jy=j%5,kx=k/5,ky=k%5;
                                double a=d(ix-jx,iy-jy),b=d(ix-kx,iy-ky),c=d(jx-kx,jy-ky),p=(a+b+c)/2,r=p*(p-a)*(p-b)*(p-c);
                                if(r>8.9&&r<9.1)s++;
                        }
        printf("%d",s);
}


把方案输出来,结果如下:
1:
o..o.
.....
o....
2:
o..o.
.....
.o...
3:
o..o.
.....
..o..
4:
o..o.
.....
...o.
5:
o..o.
.....
....o
6:
o....
...o.
o....
7:
o....
....o
..o..
8:
o....
.....
o..o.
9:
o....
.....
.o..o
10:
.o..o
.....
o....
11:
.o..o
.....
.o...
12:
.o..o
.....
..o..
13:
.o..o
.....
...o.
14:
.o..o
.....
....o
15:
.o...
....o
.o...
16:
.o...
.....
o..o.
17:
.o...
.....
.o..o
18:
..o..
o....
....o
19:
..o..
....o
o....
20:
..o..
.....
o..o.
21:
..o..
.....
.o..o
22:
...o.
o....
...o.
23:
...o.
.....
o..o.
24:
...o.
.....
.o..o
25:
....o
o....
..o..
26:
....o
.o...
....o
27:
....o
.....
o..o.
28:
....o
.....
.o..o


Process exited normally.
Press any key to continue . . .
原来是这4个怪胎在作怪:L
7:
o....
....o
..o..
18:
..o..
o....
....o
19:
..o..
....o
o....
25:
....o
o....
..o..
输出方案的代码如下:
#include<cmath>
#include<cstdio>

double d(int x,int y)
{
      return sqrt(x*x+y*y);
}

int main()
{
      int i,j,k,l,s=0;
      for(i=0;i<13;i++)
                for(j=i+1;j<14;j++)
                        for(k=j+1;k<15;k++)
                        {
                              int ix=i/5,iy=i%5,jx=j/5,jy=j%5,kx=k/5,ky=k%5;
                              double a=d(ix-jx,iy-jy),b=d(ix-kx,iy-ky),c=d(jx-kx,jy-ky),p=(a+b+c)/2,r=p*(p-a)*(p-b)*(p-c);
                              if(r>8.9&&r<9.1)
                              {
                                        printf("%d:\n",++s);
                                        for(l=0;l<15;l++)
                                        {
                                                if(l==i||l==j||l==k)printf("o");
                                                else printf(".");
                                                if(l%5>3)puts("");
                                        }
                                }
                        }
}

mathematica 发表于 2018-3-28 11:33:22

(*三角形计数*)
Clear["Global`*"];(*Clear all variables*)
(*把所有的点坐标化,方便使用行列式来计算三角形的面积*)
kk=1;
mm={
{0,0,kk},{1,0,kk},{2,0,kk},{3,0,kk},{4,0,kk},
{0,1,kk},{1,1,kk},{2,1,kk},{3,1,kk},{4,1,kk},
{0,2,kk},{1,2,kk},{2,2,kk},{3,2,kk},{4,2,kk}
};
(*使用穷举法来解决问题*)
num=0;
Do[
pa=mm[];
pb=mm[];
pc=mm[];
(*如果符合要求,那么输出三点的坐标以及次序*)
If==3*2,num=num+1;Print[{pa,pb,pc,num}]],
{i,1,15},
{j,1,15},
{k,1,15}
]


这个问题最适合穷举法

{{0,0,1},{3,0,1},{0,2,1},1}

{{0,0,1},{3,0,1},{1,2,1},2}

{{0,0,1},{3,0,1},{2,2,1},3}

{{0,0,1},{3,0,1},{3,2,1},4}

{{0,0,1},{3,0,1},{4,2,1},5}

{{0,0,1},{3,1,1},{0,2,1},6}

{{0,0,1},{4,1,1},{2,2,1},7}

{{0,0,1},{0,2,1},{3,2,1},8}

{{0,0,1},{1,2,1},{4,2,1},9}

{{1,0,1},{4,0,1},{0,2,1},10}

{{1,0,1},{4,0,1},{1,2,1},11}

{{1,0,1},{4,0,1},{2,2,1},12}

{{1,0,1},{4,0,1},{3,2,1},13}

{{1,0,1},{4,0,1},{4,2,1},14}

{{1,0,1},{4,1,1},{1,2,1},15}

{{1,0,1},{0,2,1},{3,2,1},16}

{{1,0,1},{1,2,1},{4,2,1},17}

{{2,0,1},{0,1,1},{4,2,1},18}

{{2,0,1},{4,1,1},{0,2,1},19}

{{2,0,1},{0,2,1},{3,2,1},20}

{{2,0,1},{1,2,1},{4,2,1},21}

{{3,0,1},{0,1,1},{3,2,1},22}

{{3,0,1},{0,2,1},{3,2,1},23}

{{3,0,1},{1,2,1},{4,2,1},24}

{{4,0,1},{0,1,1},{2,2,1},25}

{{4,0,1},{1,1,1},{4,2,1},26}

{{4,0,1},{0,2,1},{3,2,1},27}

{{4,0,1},{1,2,1},{4,2,1},28}

mathematica 发表于 2018-3-28 12:03:54

本帖最后由 mathematica 于 2018-3-28 12:06 编辑

(*三角形计数*)
Clear["Global`*"];(*Clear all variables*)
(*把所有的点坐标化,方便使用行列式来计算三角形的面积*)
kk=1;
mm={
{0,0,kk},{1,0,kk},{2,0,kk},{3,0,kk},{4,0,kk},
{0,1,kk},{1,1,kk},{2,1,kk},{3,1,kk},{4,1,kk},
{0,2,kk},{1,2,kk},{2,2,kk},{3,2,kk},{4,2,kk}
};
(*使用穷举法来解决问题*)
num=0;
all={};
Do[
pa=mm[];
pb=mm[];
pc=mm[];
(*如果符合要求,那么输出三点的坐标以及次序*)
If==3*2,num=num+1;all=Append],
{i,1,15},
{j,1,15},
{k,1,15}
];
Print;
(*求出三角形三边的所有的边长,并且排序*)
data=Sort[{EuclideanDistance[#[],#[]],EuclideanDistance[#[],#[]],EuclideanDistance[#[],#[]]}]&/@all
(*合并所有的相同的全等的三角形*)
Length@Union



考虑所有的全等的三角形

\[\left(
\begin{array}{ccc}
2 & 3 & \sqrt{13} \\
3 & 2 \sqrt{2} & \sqrt{5} \\
3 & 2 \sqrt{2} & \sqrt{5} \\
2 & 3 & \sqrt{13} \\
3 & \sqrt{5} & 2 \sqrt{5} \\
2 & \sqrt{10} & \sqrt{10} \\
2 \sqrt{2} & \sqrt{5} & \sqrt{17} \\
2 & 3 & \sqrt{13} \\
3 & \sqrt{5} & 2 \sqrt{5} \\
3 & \sqrt{5} & 2 \sqrt{5} \\
2 & 3 & \sqrt{13} \\
3 & 2 \sqrt{2} & \sqrt{5} \\
3 & 2 \sqrt{2} & \sqrt{5} \\
2 & 3 & \sqrt{13} \\
2 & \sqrt{10} & \sqrt{10} \\
3 & 2 \sqrt{2} & \sqrt{5} \\
2 & 3 & \sqrt{13} \\
2 \sqrt{2} & \sqrt{5} & \sqrt{17} \\
2 \sqrt{2} & \sqrt{5} & \sqrt{17} \\
3 & 2 \sqrt{2} & \sqrt{5} \\
3 & 2 \sqrt{2} & \sqrt{5} \\
2 & \sqrt{10} & \sqrt{10} \\
2 & 3 & \sqrt{13} \\
3 & 2 \sqrt{2} & \sqrt{5} \\
2 \sqrt{2} & \sqrt{5} & \sqrt{17} \\
2 & \sqrt{10} & \sqrt{10} \\
3 & \sqrt{5} & 2 \sqrt{5} \\
2 & 3 & \sqrt{13} \\
\end{array}
\right)\]

全等后的三角形的三边的边长
\[\left(
\begin{array}{ccc}
2 & 3 & \sqrt{13} \\
2 & \sqrt{10} & \sqrt{10} \\
3 & 2 \sqrt{2} & \sqrt{5} \\
3 & \sqrt{5} & 2 \sqrt{5} \\
2 \sqrt{2} & \sqrt{5} & \sqrt{17} \\
\end{array}
\right)\]
总共是5个

zeroieme 发表于 2018-3-28 14:40:50

Table[{x,y},{x,0,4},{y,0,2}]//Flatten[#,1]&//Subsets[#,{3}]&//Select[#,(PadRight[#,{3,3},1/2]//Det//Abs//#==3&)&]&//MapIndexed[{#2[],#1,(#1//Append[#,#[]]&//ListLinePlot[{{{0,0},{4,0},{4,2},{0,2},{0,2}},#},AspectRatio->1/2]&)}&,#]&

其中{{0, 0}, {2, 2}, {3, 0}}与“怪胎”{{0, 0}, {2, 2}, {4, 1}}是同底({0, 0}, {2, 2})等高转换,容易忽略,却也不算超前。

wayne 发表于 2018-3-28 14:51:47

我也试了一下,第一次,得到跟mathe一样的答案,明白mathe为什么得出24的答案了.:lol,mathe在计算这题的时候并没有乖乖的一个一个的枚举,而是直接分类穷举.

1)计算非直角的三角形.
1.1)三角形一边是水平的,3*2*2 = 12
1.2)三角形一边是竖直的,2*2 = 4
2)直角三角形,既有水平的边,又有竖直方向的边
2.1)4+4 = 8

至此,总共有$2*3*2+2*2+4+4 = 24$
3)三角形三条边都是斜线的情况.这个不宜自信的假设不存在.要回溯到前面所有的情况,对前面枚举到的所有的三角形,试着对三个边分别做等高的平移尝试,使得三条边都是斜线,发现总共有4个怪胎.如zeroieme所言.

mathe 发表于 2018-3-28 15:05:26

wayne 发表于 2018-3-28 14:51
我也试了一下,第一次,得到跟mathe一样的答案,明白mathe为什么得出24的答案了.,mathe在计算这题的 ...

稍微有点差别,我是不同的分类计算
i)底为3高为2的有5*2*2
ii)底为2高为3的有3*2*2
iii)两者的交集也就是直角三角形4*2
所以总共5*2*2+3*2*2-4*2
我很赞同Fans的怪胎的说法。因为如果我们要考虑三条边是斜线的情况,那么即使找出了这个怪胎,我们又该如何去解释就没有其它的怪胎了呢?难道一一穷举?

wayne 发表于 2018-3-28 15:10:29

@mathe, 恩,姑且叫带有双重目标的枚举.从一开始枚举的时候就要带着A计划和B计划.A计划就是肉眼扫描,依据自己定的大类的标准,扫描出所有的符合大类的三角形.B计划就是在符合当前大类的情况下,顺便再做进一步的平移操作,看是否能构造出等面积的三边都是斜边的三角形

zeroieme 发表于 2018-3-28 16:42:06

本帖最后由 zeroieme 于 2018-3-28 16:43 编辑

无法上传图片,就试着文字描述

假设三角形AMN的外接矩形为ABCD。线段 AB与CD为矩形对边,长度为a。线段 BC与DA为矩形对边,长度为b。M在CD上,CM长度为c。N在BC上,CN长度为d。
那么三角形AMN面积\(a b-\frac{1}{2} c d-\frac{1}{2} b (a-c)-\frac{1}{2} a (b-d)=\frac{1}{2} (a d+b c-c d)=3\)并\(a\geq 4\land b\geq 2\land a\geq b\land a\geq c\land b\geq d\)的自然数解也是容易穷尽的。
再以全等分类,平移反射记数。

mathematica 发表于 2018-3-28 17:23:52

mathe 发表于 2018-3-28 15:05
稍微有点差别,我是不同的分类计算
i)底为3高为2的有5*2*2
ii)底为2高为3的有3*2*2


由最小的勾股数是
3^2+4^2=5^2
而最大坐标是(2,4)
所以推测三角形至少有一边是无理数
可以分三种情况
1\只有一边是无理数
2\只有两边是无理数
3\三边都是无理数
这样分类应该不会出问题
看四楼的矩阵,三边都是无理数的三角形正好是四个
页: [1]
查看完整版本: 三角形计数