华为机试-091-简单-HJ91.走方格的方案数
一、描述
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
数据范围: 1 ≤ n , m ≤ 8
1.1、输入描述
输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
1.2、输出描述
输出一行结果
二、示例
2.1、示例1
输入:
2 2
输出:
6
三、答案(java)
3.1、方法一
package com.tzq.hwod;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int m = sc.nextInt();
int n = sc.nextInt();
System.out.println(cal(m, n));
}
}
private static int cal(int m, int n) {
if (m == 1 || n == 1) {
return m + n;
}
return cal(m - 1, n) + cal(m, n - 1);
}
}
四、答案(python 3)
抽丝剥茧
这个题干非常简单,也是大家在中学阶段经常遇到的一个数学问题——不可逆行走问题。 即,从左上角走到右下角,且只能向右和向下行走。
4.1、方法一
化繁为简
根据大家比较熟悉的思路,我们可以使用递归的方法来将大的问题分解为小的子问题。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def func(x, y):
if x < 0 or y < 0:
return 0
elif x == 0 or y == 0:
return 1
else:
return func(x - 1, y) + func(x, y - 1)
while True:
try:
n, m = map(int, input().split())
res = func(n, m)
print(res)
except:
break
下面使用图解来展示一下输入为“2 2”的情况:
4.2、方法二
另辟蹊径
由于“不可逆”,所以从起点到终点走的总步数是确定的,向下或向右走的步数也是确定的。例如,当输入为m×nm\times nm×n时,需要走的总步数也就一定是(m+n)(m+n)(m+n)步。同时为了能够走到右下方,一定需要向下走m步,向右走n步。 故也可以使用组合数来完成。即把这个问题抽象为从(m+n)步中挑出m步向下走的种数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import math
while True:
try:
row, col = map(int, input().split())
total_step = col + row
res = math.factorial(total_step) / (math.factorial(col) * math.factorial(row))
print(int(res))
except:
break