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

方法一使用递归,出口条件:如果一直向右或者一直向下,必然只有一种方法;

递归方法:在(n,m)处,要么是从(n-1,m)往右,要么是从(n,m-1)往下。

方法二使用循环遍历,原理和方法一类似,不过要注意数组的边界问题,数组初始化时,应当为(n+1)*(m+1)。

package test;

import java.util.Scanner;

public class exam05 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int m = scanner.nextInt();
// System.out.println(get1(n, m));
System.out.println(get2(n + 1, m + 1));
}
} private static int get1(int n, int m) {
// 方法1:递归
int sum = 0;
if (n > 0 && m > 0)
return sum = get1(n - 1, m) + get1(n, m - 1); else {
return 1;
}
} private static int get2(int n, int m) {
// 方法2:循环遍历
int[][] a = new int[n][m];
for (int i = 0; i < n; i++) {
a[i][0] = 1;
}
for (int j = 0; j < m; j++) {
a[0][j] = 1;
} for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < m - 1; j++) {
// 该点必然经过所有左侧点和上侧点经过的路
a[i + 1][j + 1] = a[i + 1][j] + a[i][j + 1];
}
} return a[n - 1][m - 1];
} }

最新文章

  1. 印刷电路板(PCB)的材料
  2. MSSQL订阅库索引对齐
  3. Medical Image Processing Conference and Journal 医学图像处理会议与期刊
  4. Android HandlerThread 使用
  5. 【USACO 3.2.2】二进制数01串
  6. C++ 语言特性的性能分析
  7. Android ScrollView用法
  8. mysql之多列索引
  9. HDU 3265 Posters
  10. 关于Android App开发技术分类的一个小总结
  11. React入门---事件与数据的双向绑定-9
  12. Socket套接字
  13. dp水一天
  14. 浅析java的深拷贝与浅拷贝
  15. [Apio2012]dispatching 左偏树
  16. dijkstra算法:寻找到全图各点的最短路径
  17. 构建Dubbo-2.0.7源码
  18. 合作开发工具——freeze和pipreqs
  19. OOA/OOD&amp;UML部分
  20. Mac电脑如何设置DHCP

热门文章

  1. swagger.yaml转换为swagger.json文件
  2. css---6 选择器声明的优先级
  3. 纯PHP Codeigniter(CI) ThinkPHP效率测试
  4. Java 基础 - CLASSPATH 到底是什么
  5. CSS——精灵技术
  6. DELPHI实现类似仿360桌面的程序界面
  7. error C2220: warning treated as error - no object file generated的处理方法
  8. 从零学React Native之13 持久化存储
  9. 简单总结Class.forName("").newinstance()和new()以及classLoader.loadClass("")的区别
  10. vs2017 Visual Studio 离线安装方法