枫原万叶


私信TA

用户名:dotcpp0605256

访问量:374

签 名:

等  级
排  名 23786
经  验 629
参赛次数 0
文章发表 7
年  龄 0
在职情况 学生
学  校 怀化学院
专  业

  自我简介:

TA的其他文章

解题思路:

注意事项:

参考代码:

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 人评分

  评论区

  • «
  • »