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