一个有趣的算法题

题目描述:

  有一个100*1000矩形,要在这个矩形框中种树,要求每颗树之间的距离不得小于1米,问最多可以种多少树?

 

题目分析:

   每两个树之间的距离必须大于等于1米,那么直觉上会想到等边三角形,这样就可以满足任意两个点之间的距离为1米,那么我们的想法就是用1米长的等边三角形去填充那个矩形。

   我们以100为宽,1000为高,那么第一行可以种101颗,以正三角形来安放,那么第二行就是中100颗,如图所示:

                                                    

                                         1      2     3     4 。。。。

                                            1      2     3 

     那么可以算出,每两行之间的 高度为 sqrt(3) / 2 = 0.866...,然后通过计算 1000 / 0.866 = 1154 ,那么一共就可以种1155行,所以最多可以种的树的数量为 101 * (1155/2+1) + 100 * 1155/2 = 116078。

     算到这个地方,问题似乎解决了,但是细心一点可以发现,当你种到1155行后,一共只是用掉了 1154*0.866 = 999.39 ,还有 0.61的地方没有用,但是还种一排显然是不合格的。

     可是如果我们最后几排不遵守正三角形规则的话,每行高度不是相差0.866么 ,只是差 0.134,所以一旦我们将上下高度调整为1米,那么偶数排可以多种一颗树,那么现在如果我们按三角形法则种树,种到第1151行,这时候一共占据高度1150*0.866=995.9,以下的种树我们按着排的1米宽度种一行,那么 995.9 + 1 + 1 + 1 + 1 = 999.9 ,加起来刚好也是1155行,两行偶数,两行奇数,只是偶数行比以前多了1颗树,所以一共多了两颗,所以最后的答案便是116080颗!

     还有一种思路是,用半径为1的圆填充,看填不能相交的圆一共有多少个,矩形区域变成102*1002的大小,其实质也是等边三角形填充!

    从这个可以看出,用等边三角形填充往往对这样的问题比较实用 ,但最后一定要想清楚,如果不是刚好够,最后处理的时候要适当的不按规则图形来填充!

你可能感兴趣的:(算法,有趣,种树)