N*M(N行,M列)的矩形,内部是一个个的网格;
2*2:经过2个 3*2:经过4个 4*2:经过4个
2*3:经过4个 3*3:经过3个 4*3:经过6个
2*4:经过4个 3*4:经过6个 4*4:经过4个
2*5:经过6个 3*5:经过7个 4*5:经过8个
不多写了,可以发现:
1:如果M和N没有公约数,那么经过的正方形个数就是M+N-1
画图比较容易发现这一点,N*M一共含有N-1横边和M-1条竖边,左上角的一个矩形是一定经过的,之后这条斜线想要进入下一个矩形,必须要经过一条内部的边(横边或者竖边),一共经过经过N-1+M-1条内部边(因为每走一步必定经过一个边),也就是N-1+M-1个矩形加上最左上角的一个矩形,这就是N+M-1个矩形。
2:如果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+N-(M和N的最大公约数);
其实1和2可以合并起来,经过的矩形数目是:M+N-(M和N的最大公约数),问题转换为求M和N的最大公约数,这应该就不难了。
这道算法题按照你的方法,我AC了,真是太谢谢你了。