算法题——立方体的体对角线穿过多少个正方体?
这道题是笔者当年参加竞赛的题目,多年来一直未得其解,久久不能释怀。近日,重新拿起该题细细研究,终于将其解出,著文以记之。
问题描述:
长方体长X,宽Y,高Z。X、Y、Z都是正整数。长方体由长1、宽1、高1的正方体堆积而成。那么长方体的体对角线穿过多少个正方体?
这个题考量三维空间的想象。近日研究的时候,尝试先考量二维的情况,在求解出二维的情况下,在推广到三维里。下面是二维情况下的问题描述
长方形长X,宽Y。X、Y都是正整数。长方形由长1、宽1的正方形组成。那么长方形的对角线穿过多少个正方形?
以实例说明。长方形长6,宽4。长方形由长1、宽1的正方形组成。那么长方形的对角线穿过多少个正方形?
这个还是比较简单的,直接用图表示即可,如下图所示:
如上图所示,对角线一共穿过8个正方形(灰色部分)。但是,我们不可能每个问题都画图表示,比如长777,宽581的长方形的解就很难画图表示(数字太大,不容易精确表示)。
仔细看看,这8个正方形实际上把对角线分成了8段。线段的端点是对角线和水平线(或竖直线)的交点。
于是,问题似乎可以转化成
要求穿过多少个正方形,实际上相当于求有多少个线段
要求有多少个线段,实际上相当于求对角线和水平线和垂直线的交点的个数
把上图放在平面直角坐标系中,左下角坐标为(0,0),右上角坐标为(6,4)
则对角线的直线方程为
和我们一般想象中的直线方程不太一样。没关系,首先这个是正确的直线方程,其次是为了和后面的三维中的直线方程的表现形式统一。
我们把对角线和水平线(或竖直线)的交点在图上标示出来(为了后文的描述方便,我用不同颜色标示点)
左下角的起点用灰色标示,红色的点标示对角线和竖直线的交点(交点的横坐标是整数),绿色的点标示对角线和水平线的交点(交点的纵坐标是整数)
起点不算,则穿过的方块数和线段数和点的个数一致(都是8个)。
红色点的坐标(横坐标是整数)分别是:
个数和长方形的长的数值是一致的(是6)
绿色点的坐标(纵坐标是整数)分别是:
个数和长方形的宽的数值是一致的(是4)
可以看出,红色点和绿色点有2个点是重合的(图上用半红半绿的点标示),因此这些点合在一起就是如下(按照和起点的远近来进行排序)
于是该问题的求解过程可以如下表示:
1、求出横坐标是整数的点的个数,就是长方形长的数值。本题是6
2、求出纵坐标是整数的点的个数,就是长方体宽的数值。本题是4
3、求出步骤1和步骤2中重合的点的个数,也就是横纵坐标都是整数的点的个数。本题是2
4、问题的答案:步骤1的答案+步骤2的答案-步骤3的答案。本题是6+4-2=8
步骤1、2、3、4中,关键是步骤3,如何求出步骤1和步骤2中重合的点的个数,也就是横纵坐标都是整数的点的个数。
最大公约数:正整数a和b,若a能被b整除,则a是b的倍数,b是a的约数。正整数a和b中约数最大的那个称为a和b的最大公约数,记作gcd(a,b)
本题中,(4,6)=2,正好是步骤3的答数,是巧合么?不是,接下来我们来证明。
证明:长X、宽Y的长方形,对角线经过双整数点(横纵坐标都是整数)的个数为gcd(X,Y)(注:不算起点)
证:令x1=X/gcd(X,Y),y1=Y/gcd(X,Y)。则x1和y1都是整数,且x1和y1互质(除1以外,没有公约数)。
对角线所在的直线方程为
当x取整数时(1≤x≤X)时,要使y也是整数,则x必须取x1的倍数(这样才能把分母完全约掉)
而在1到X之间,x1的倍数一共有gcd(X,Y)个
证明完毕
综上所述:长方形长X,宽Y。X、Y都是正整数。长方形由长1、宽1的正方形组成。那么长方形的对角线穿过多少个正方形?
其解为:Ans=X+Y-gcd(X,Y),可以用下图表示
例如:
长6,宽4的长方形的对角线穿过6+4-gcd(6,4)=6+4-2=8个正方形
长5,宽3的长方形的对角线穿过5+3-gcd(5,3)=5+3-1=7个正方形
长12,宽8的长方形的对角线穿过12+8-gcd(12,8)=12+8-4=16个正方形
扩展到三维。长方体长X,宽Y,高Z。X、Y、Z都是正整数。长方体由长1、宽1、高1的正方体堆积而成。那么长方体的体对角线穿过多少个正方体?
长X、宽Y、高Z的立方体的体对角线的直线方程是
这个方程虽然有点怪,但是学过空间解析几何的都明白这个方程的正确性
求解的过程和二维的类似,也是找寻坐标是整数的点。可以用下图表示:
其解为:Ans=X+Y+Z-gcd(X,Y)-gcd(X,Z)-gcd(Y,Z)+gcd(X,Y,Z)
例如:
长5,宽3,高4的长方体的体对角线穿过5+3+4-gcd(5,3)-gcd(5,4)-gcd(3,4)+gcd(5,3,4)=5+3+4-1-1-1+1=10个正方体
长8,宽6,高3的长方体的体对角线穿过8+6+3-gcd(8,6)-gcd(8,3)-gcd(6,3)+gcd(8,6,3)=8+6+3-2-1-3+1=12个正方体
长12,宽8,高6的长方体的体对角线穿过12+8+6-gcd(12,8)-gcd(12,6)-gcd(8,6)+gcd(12,8,6)=12+8+6-4-6-2+2=16个正方体
下图是长5,宽3,高4的长方体的体对角线穿过正方体的示意图,一共10个正方体,你看清了么?
这个题历时若干年,总是百思不得其解。也是今朝灵光一闪,终于把该题解决了。也总算是一块石头落了地
算法题——立方体的体对角线穿过多少个正方体?相关推荐
- 【转】立方体的体对角线穿过多少个正方体?
问题描述: 长方体长X,宽Y,高Z.X.Y.Z都是正整数.长方体由长1.宽1.高1的正方体堆积而成.那么长方体的体对角线穿过多少个正方体? 这个题考量三维空间的想象.近日研究的时候,尝试先考量二维的情 ...
- 【算法思想】数学归纳法在算法题中的应用(含例题举例)
[算法思想]数学归纳法在算法题中的应用(含例题举例) 前言 数学归纳法 应用举例 1. 前n项和 2. 区域计数 3. 着色问题 4. 金字塔求和 5. 简单不等式 6. 欧拉公式 7. 有路可达 8 ...
- 【精选】Python入门算法题(三)
今天无意中发现一道算法题很有意思,题不难,都是初中的知识,主要就是求一个固定点到一条直线的最短距离,我用了一个非常麻烦的方法才求出,我先是用余弦定理求出夹角再判断用勾股定理结合方程组解出来,很是麻烦, ...
- Re: 求助:5道算法题
http://www.newsmth.net/frames.html 发信人: cutepig (cutepig), 信区: Algorithm 标 题: 求助:5道算法题 发信站: 水木社区 (S ...
- 经典算法题每日演练——第六题 协同推荐SlopeOne 算法
原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢&quo ...
- 算法总结---最常用的五大算法(算法题思路)
算法总结---最常用的五大算法(算法题思路) 一.总结 一句话总结: [明确所求:dijkstra是求点到点的距离,辅助数组就是源点到目标点的数组] [最简实例分析:比如思考dijkstra:假设先只 ...
- BAT七年经验,却抵不过外企面试的两道算法题?
整理| 琥珀 出品| AI科技大本营 又遇年底跳槽季,如果你曾在 BAT 等互联网大厂有过较为丰富的工作经验,想要换份工作,面试时会主要考虑哪些因素? 面试外企,却被两道算法题难住? 近日,一位网友在 ...
- 字节跳动面试官:你离50w年薪就差答对了这个算法题!
我有个朋友,最近去头条面试,因为算法题没写出来,直接面挂了,搞得他非常郁闷. 众所周知,算法对程序员来说越来越重要了,但是总有人抱有一丝侥幸,不肯投入精力去学习,想着现在的工作中反正也用不到,等找工作 ...
- 一道看完答案你会觉得很沙雕的「动态规划算法题」
这道算法题其实并不难,如果你把文章从头到尾看完的话基本上能看懂,但如果你看到最后的话大概率会说一句:这是什么沙雕题目?! 题目来源于 LeetCode 第 877 号问题:石子游戏. 为了更好理解,我 ...
最新文章
- 保守的机器学习如何拯救日新月异的我们
- 第一次使用Android Studio时你应该知道的一切配置
- windows 7 在使用无线路由或者插线出现×××感叹号排除方法
- ICPC2008哈尔滨-E-Gauss Elimination
- 设计模式--命令(Command)模式
- Winform中使用异或算法对数字进行加密解密
- React学习小结(二)
- 到底什么是跨域?附解决方案
- linux python3_在Linux上安装Python 3
- CSU 1114 平方根大搜索
- win32开发(调试)
- Xcode打包上传时,最后一步出现An error occurred uploading to the iTunes Store.的解决方法...
- contentType,charset和pageEncoding的区别
- UmiJS介绍--快速上手(一)
- 人脸门禁系统解决方案及应用
- iOS常用RGB颜色的色值一览表
- 全网目前最全python例子(附源码)八、Python实战
- 手游联运系统隐藏福利大揭秘
- 草图大师素材是如何快速导入到模型中的呢?草图溜溜来替你解答
- BUUCTF MISC刷题笔记(五)
热门文章
- mac +xcode 下WebDriverAgent环境配置
- 内网实现电视盒子访问PC
- CVPR2019|最新更新论文~持续更新|CVPR2019百度云下载
- socket套接字各个接口
- 矩阵论(一):广义逆矩阵(上)
- 论文阅读_Show, Attend and Tell: Netural Image Caption Generation with Visual Attention
- 云编译DSM引导(学习记录)
- linux下C++编程学习
- 编程需要那些数学和计算机知识点,学习编程需要哪些基础?
- docke容器启动后立马退出,状态为 Exit(1)的解决