【简单】算法nodeJs:方格的方案数

189 阅读2分钟

请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。

注:沿棋盘格之间的边缘线行走

数据范围: 1≤n,m≤8 

输入描述:

输入两个正整数n和m,用空格隔开。(1≤n,m≤8)

输出描述:

输出一行结果

var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    function fn(m, n) {
        if(m==0 || n==0){
            return 1;
        }else{
            return fn(m-1,n)+fn(m,n-1)
        }
    }
    while ((line = await readline())) {
        line = line.split(" ");
        var num = fn(Number(line[0]), Number(line[1]));
        console.log(num);
    }
})();

代码的解释

1. 递归函数 fn(m, n)

fn(m, n)是一个递归函数,用来计算从左上角到右下角的路径数量。假设有一个 m * n 的棋盘:

  • 递归终止条件:当 mn 为 0 时,返回 1。因为如果有一行或一列的格子数为 0(即沿着棋盘的边缘),只能沿边缘走,唯一的路径就是一直走下去或一直走右边。

  • 递归公式:如果 m > 0n > 0,则:

    • 从 (m, n) 到右下角,可以通过从 (m-1, n)(即上面一个格子)或 (m, n-1)(即左边一个格子)到达。所以路径数是:

      fn(m-1, n) + fn(m, n-1)
      

    这就意味着:从 (m, n) 这个位置,路径数等于从它的上方格子加上从它的左方格子的路径数。

2. 主程序逻辑

  • iter = rl[Symbol.asyncIterator]();:这行代码用来创建一个异步的读取迭代器,rl 是输入数据,表示异步读取输入。
  • const readline = async () => (await iter.next()).value;:定义 readline 函数来读取输入行。

3. 主执行函数 async function ()

  • 在主执行函数内部:

    • 调用 readline() 获取输入行,然后分割成两个数字 n 和 m
    • 使用递归函数 fn(Number(line[0]), Number(line[1])) 计算从左上角到右下角的路径数。
    • 最后,使用 console.log(num) 输出结果。