1、问题描述
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,
从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。问有多少种方案。
【输入格式】
输入一行包含两个整数 n, m。
【输出格式】
输出一个整数,表示答案。
【样例输入】
3 4
【样例输出】
2
【样例输入】
6 6
【样例输出】
0
2、深搜实现代码
import java.util.Scanner;
public class Main{
static int n;
static int m;
static int[][] map;
static int ans = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
map = new int[n + 1][m + 1];
dfs(1,1);
System.out.println(ans);
}
public static void dfs(int x,int y) {
//结束递归条件
if(x % 2 == 0 && y % 2 == 0) {
return;
}
if(x == n && y == m) {
ans++;
return;
}
//继续递归的条件
if(x < n) dfs(x + 1,y);
if(y < m) dfs(x,y + 1);
}
}
3、动态规划
import java.util.Scanner;
public class Main {
static int n;
static int m;
static int[][] dp;
static int ans = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
dp = new int[n + 1][m + 1];
if(n % 2 == 0 && m % 2 == 0) {
System.out.println(0);
return;
}
dp[1][1] = 1;
for(int i = 1;i <= n;i++ ) {
for(int j = 1;j <= m ;j++) {
if(i == 1 && j == 1) {
continue;
}
//取上一行
if(i > 1) {
dp[i][j] += dp[i - 1][j];
}
//取左一列
if(j > 1) {
dp[i][j] += dp[i][j - 1];
}
//不能走
if(i % 2 == 0 && j % 2 == 0) {
dp[i][j] = 0;
}
}
}
System.out.println(dp[n][m]);
}
}