解题思路:

注意事项:

参考代码:

import java.util.Scanner; // 导入Scanner类用于接收用户输入

public class Main {
    static int[][] a = new int[50][50]; // 定义一个50x50的二维数组a,用于存储棋盘或网格的状态

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 创建一个Scanner对象sc来读取标准输入
        int n = sc.nextInt(); // 读取棋盘或网格的行数n
        int m = sc.nextInt(); // 读取棋盘或网格的列数m
        int x = sc.nextInt(); // 读取马的位置的行坐标x
        int y = sc.nextInt(); // 读取马的位置的列坐标y

        // 初始化二维数组a,将所有元素设置为1
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                a[i][j] = 1; // 假设1表示该位置可达或可用
            }
        }

        a[x][y] = 0; // 将马所在的位置设置为0,表示该位置不可达或不可用

        // 设置马的控制点(即马能攻击到的位置)为0
        if (x - 1 >= 0 && y - 2 >= 0) a[x - 1][y - 2] = 0; // 马的左上角控制点
        if (x - 2 >= 0 && y - 1 >= 0) a[x - 2][y - 1] = 0; // 马的上面控制点
        if (x - 2 >= 0 && y + 1 < m) a[x - 2][y + 1] = 0;  // 马的右上角控制点
        if (x - 1 >= 0 && y + 2 < m) a[x - 1][y + 2] = 0;  // 马的左边控制点
        if (x + 1 < n && y + 2 < m) a[x + 1][y + 2] = 0;   // 马的右下角控制点
        if (x + 2 < n && y + 1 < m) a[x + 2][y + 1] = 0;   // 马的下面控制点
        if (x + 2 < n && y - 1 >= 0) a[x + 2][y - 1] = 0;  // 马的左下角控制点
        if (x + 1 < n && y - 2 >= 0) a[x + 1][y - 2] = 0;  // 马的右边控制点

        // 动态规划填表过程,计算从(0,0)到每个位置(i,j)的不同路径数
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                // 跳过(0,0)位置,因为路径数是从(0,0)开始计算的
                if (i == 0 && j == 0) continue;
                // 如果当前位置不可达(为0),则跳过该位置
                if (a[i][j] == 0) continue;
                // 如果当前位置在第一行,则它的路径数等于它左边的位置的路径数
                if (i == 0)
                    a[i][j] = a[i][j - 1];
                    // 如果当前位置在第一列,则它的路径数等于它上面的位置的路径数
                else if (j == 0)
                    a[i][j] = a[i - 1][j];
                    // 否则,当前位置的路径数等于它上面和左边两个位置的路径数之和
                else
                    a[i][j] = a[i - 1][j] + a[i][j - 1];
            }
        }

        // 输出从(0,0)到(n,m)的不同路径数
        System.out.println(a[n][m]);

        // 关闭Scanner对象,释放相关资源
        sc.close();
    }
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论