您的位置:首页 > 编程语言 > Java开发

Java实现棋盘格子走法

2017-06-03 10:48 363 查看


题目描述

请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。

输入描述:
输入两个正整数

输出描述:
返回结果

输入例子:
2
2


输出例子:
6


刚做完摆放苹果的问题,做这个棋盘的时候,我想这个肯定是有递推公式的:

把整个棋盘看成是二维数组,从[0][0]走到
[m],因为只能向右或者向下,也就是说

[0][0]->[1][0]->……
[m]

[0][0]->[0][1]->……
[m]

如果向右走一步,也就是说从[0][0]走到
[m]等价于从[1][0]走到
[m]

如果向下走一步,也就是说从[0][0]走到
[m]等价于从[0][1]走到
[m]

终止条件是什么呢?

当点已经走到了棋盘边缘,没有向右或者向下的选择了,只能一条线只右或者直下的到达终点了,这个时候就该结束了。

所以我总结的递推公式是:

[m]
=[m-1]
+[m][n-1]

为什么是减呢,主要是如果用[0][0]去加,不知道该怎么去保存终点m,n的数值。向下向右,等价于向上向左嘛。

最后一次AC的代码为:

import java.util.*;

public class Main{

public static void main(String args[]){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int m=sc.nextInt();
System.out.println(Fun(n,m));}
}

public static int Fun(int n,int m){
if(m==0||n==0){
return 1;
}

int result=Fun(m-1,n)+Fun(m,n-1);
return result;

}
}

然后看到了大神的解法,非递归形式的:

链接:https://www.nowcoder.com/questionTerminal/e2a22f0305eb4f2f9846e7d644dba09b
来源:牛客网

import java.util.*;
 
public class Main
{
    public static void main(String []args)
    {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext())
        {
            int n = sc.nextInt();
            int m = sc.nextInt();
             
            int top = factorial(m+n);
            int behind = factorial(m)*factorial(n);
            System.out.println(top/behind);
        }
    }
     
    public static int factorial(int n)
    {
        int sum = 1;
        for(int i = 1;i<=n;i++)
        {
            sum *= i;
        }
        return sum;
    }
}
分析一下,其实是这样的:
factorial函数是一个求阶乘的函数,阶乘令我想到了概率,

这如果按照概率的思路来解决,也就是从[0][0]走到
[m]中,从n+m步中选择
步向下走,剩下的m步向右走。

wowo~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA