华为机试-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

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tzq@2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值