问题描述:
在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后,这匹马表示它不开心了……
于是,终于有一天,它也过河了!
由于过河马积累了许多的怨念,所以这次它过了河之后,再也没有什么东西可以限制它,它可以自由自在的在棋盘上驰骋。一开始,它是在一个n行m列棋盘的左下角(1,1)的位置,它想要走到终点右上角(n,m)的位置。而众所周知,马是要走日子格的。可是这匹马在积累了这么多怨念之后,它再也不想走回头路——也就是说,它只会朝向上的方向跳,不会朝向下的方向跳。
那么,这匹马它也想知道,它想从起点跳到终点,一共有多少种走法呢?
输入格式:
第一行两个数n,m,表示一个n行m列的棋盘,马最初是在左下角(1,1)的位置,终点在右上角(n,m)的位置。
输出格式:
输出有一行,一个数表示走法数。由于答案可能很大,所以输出答案除以1000000007所得的余数即可。
样例输入:
4 4
样例输出:
2
数据规模和约定:
n<=100,m<=100
思路:
可能大家在看到这四个点的位置,未免会感到有一些奇怪,按照我们先入为主的观念,我们可能会想到马过河应该应该会在上面,但是注意看题目,我们这里的马是从左边的点(1,1)到右上角的点(X,Y),所以我们就可以得到下面的点。
由于马过河后不再往回走因此我们可以得到马在当前位置(i,j)可以是由四个点移动到达
①(i-1,j-2)②(i-2,j-1)③(i-2,j+1)④(i-1,j+2),当然这四点分别又可以其他不同4组的4个点所构成。
完整代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int CONST = 1000000007;
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
long[][] arr = new long[105][105];
arr[1][1] = 0;//马初始的位置
arr[2][3] = 1;//马在特定条件下初始化其第一步可能存在的情况一
arr[3][2] = 1;//马在特定条件下初始化其第一步可能存在的情况二
for (int i = 1; i <= a; i++){
for (int j = 1; j <= b; j++){
if (i-1>=1 && j-2>=1)//防止数组的角标越界
arr[i][j] += arr[i-1][j-2];
if (i-2>=1 && j-1<=b)
arr[i][j] += arr[i-2][j-1];
if (i-2>=1 && j+1<=b)
arr[i][j] += arr[i-2][j+1];
if (i-1>=1 && j+2<=b)
arr[i][j] += arr[i-1][j+2];
arr[i][j] %= CONST;//每一次轮回进行一次取余
}
}
System.out.println(arr[a][b]);//输出到达目标位置的总次数
}
}
测试结果:
