蓝桥杯 算法训练 过河马(Java)

该问题描述了一匹马在n×m的棋盘上从左下角(1,1)移动到右上角(n,m),且每次只能向上跳跃,不允许回头。给定的Java代码计算了所有可能的走法数量,使用动态规划存储每个位置的走法数,并对结果取模以防止溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后,这匹马表示它不开心了……
  于是,终于有一天,它也过河了!
  由于过河马积累了许多的怨念,所以这次它过了河之后,再也没有什么东西可以限制它,它可以自由自在的在棋盘上驰骋。一开始,它是在一个n行m列棋盘的左下角(1,1)的位置,它想要走到终点右上角(n,m)的位置。而众所周知,马是要走日子格的。可是这匹马在积累了这么多怨念之后,它再也不想走回头路——也就是说,它只会朝向上的方向跳,不会朝向下的方向跳。
  那么,这匹马它也想知道,它想从起点跳到终点,一共有多少种走法呢?

输入格式:

  第一行两个数n,m,表示一个n行m列的棋盘,马最初是在左下角(1,1)的位置,终点在右上角(n,m)的位置。

输出格式:

输出有一行,一个数表示走法数。由于答案可能很大,所以输出答案除以1000000007所得的余数即可。

样例输入:

4 4

样例输出:

2

数据规模和约定:

n<=100,m<=100

思路:

  1. 可能大家在看到这四个点的位置,未免会感到有一些奇怪,按照我们先入为主的观念,我们可能会想到马过河应该应该会在上面,但是注意看题目,我们这里的马是从左边的点(1,1)到右上角的点(X,Y),所以我们就可以得到下面的点。

  1. 由于马过河后不再往回走因此我们可以得到马在当前位置(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]);//输出到达目标位置的总次数
    }
}

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucas-Lu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值