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实现
- 马踏棋盘:贪心算法java实现
- 棋盘覆盖 java实现
- Java基于分治算法实现的棋盘覆盖问题示例
- 马踏棋盘问题(骑士周游问题)及其优化算法java实现
- 分治算法---棋盘覆盖问题java代码实现
- 【LeetCode-面试算法经典-Java实现】【036-Valid Sudoku(验证数独棋盘)】
- A*搜索算法的JAVA实现 解棋盘爵士游历问题 BFS
- Java实现两人五子棋游戏(二) 画出棋盘
- 蓝桥杯 格子刷油漆(Java实现)
- 实验一 分治与递归―棋盘覆盖问题 java实现
- 棋盘覆盖--递归分治java实现
- 棋盘覆盖 算法分析、设计与实现(Java)
- 马踏棋盘算法 Java实现
- 算法java实现--分治法--棋盘覆盖问题
- java 实现棋盘覆盖问题
- 棋盘覆盖--递归分治java实现
- java实现的棋盘覆盖
- Java实现一个简单的两人五子棋游戏(二) 画棋盘
- 分治:棋盘覆盖的java程序实现