前两天数学建模校内选拔赛的题目中,有一问是让求出最短路径以及经过的方格数,而最短路径是很多段折线,需要计算每段折线经过的方格数再加起来。
本来打算直接在程序里加几行代码计算的,后来发现可以直接推导出结论:
对于一个长度为mmm,宽度为nnn的矩形,均分成m∗nm*nm∗n个小方格,则对角线经过的小方格数量为m+n−(m,n)m+n-(m,n)m+n−(m,n),其中(m,n)(m,n)(m,n)为mmm和nnn的最大公约数。
证明:
①先考虑mmm和nnn互质的情况,即(m,n)=1(m,n)=1(m,n)=1时,由于对角线的斜率为k=nmk=\frac{n}{m}k=mn为既约分数,显然对角线除了两个端点外不会经过内部格点。
而对角线与m+1m+1m+1条竖直线有m+1m+1m+1个交点,与n+1n+1n+1条水平线有n+1n+1n+1个交点,由于对角线的两个端点被重复计算,所以对角线与所以格线共有m+1+n+1−2=m+nm+1+n+1-2=m+nm+1+n+1−2=m+n个交点。
而这m+nm+nm+n个交点将对角线分为m+n−1m+n-1m+n−1段,每一小段都与包含它的小方格一一对应,所以对角线共经过了m+n−1m+n-1m+n−1个小方格。
②再考虑mmm和nnn不互质的情况,即(m,n)=d>1(m,n)=d>1(m,n)=d>1时,由于对角线的斜率为k=nm=n/dm/dk=\frac{n}{m}=\frac{n/d}{m/d}k=mn=m/dn/d,所以对角线一共经过了ddd个长为md\frac{m}{d}dm,宽为nd\frac{n}{d}dn的小矩形。取长为md\frac{m}{d}dm,宽为nd\frac{n}{d}dn的小矩形作为研究对象,每一个小矩形都是长宽互质的。使用①中的结论,对角线在每个小矩形中经过的小方格数为md+nd−1\frac{m}{d}+\frac{n}{d}-1dm+dn−1,所以一共经过了d∗(md+nd−1)=m+n−dd*(\frac{m}{d}+\frac{n}{d}-1)=m+n-dd∗(dm+dn−1)=m+n−d个小方格。
综合①②,对于一个长度为mmm,宽度为nnn的矩形,均分成m∗nm*nm∗n个小方格,则对角线经过的小方格数量为m+n−(m,n)m+n-(m,n)m+n−(m,n),其中(m,n)(m,n)(m,n)为mmm和nnn的最大公约数。