题目
问题描述在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,
从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下
走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
代码如下
package com.hzc.bluecap;
import java.util.Scanner;
public class 走方格 {
private static long sum;
public static void main(String[] args) {
//输入
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
//递归方法
f(n,m);
System.out.println("f()"+" "+sum);
//动态规划方法
f2(n,m);
}
private static void f(int n, int m) {
//出口,当n==1,m==1时就回到了原点,<防止越界,如果成功回到原点表示这条路可以走
if(n<=1&&m<=1) {
sum++;
return;
}
//如果走到全偶数格子就表示此路不通
if(m%2==0&&n%2==0){
return;
}else {
//当n<1时不符合要求
if(n>=1) {
f(n-1,m);
}
//当m<1时不符合要求
if(m>=1) {
f(n,m-1);
}
}
}
private static void f2(int n,int m){
int[][] arr=new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j <m; j++) {
//初始化数据
if(i==0||j==0) {
arr[i][j]=1;
//因为从0开所以全偶数格变为全奇数格表示走不通
}else if(i%2!=0&&j%2!=0){
arr[i][j]=0;
/*因为走到当前格子可以通过他上面的一个格子和左边的一个格子达到所以吧达到
左边和上边的路的条数加起来就是这个格子的路的条数*/
}else {
arr[i][j]=arr[i-1][j]+arr[i][j-1];
}
}
}
//输出达到目标的路径总数(是前面可行方法的总和)
System.out.println("f2()"+" "+ arr[n-1][m-1]);
}
}