解题思路:
注意事项:
参考代码:
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 人评分
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:568 |
不知道哪里错了浏览:1226 |
模拟计算器 (C语言代码)浏览:966 |
C语言程序设计教程(第三版)课后习题8.2 (Java代码)浏览:2287 |
简单的a+b (C语言代码)浏览:783 |
C语言考试练习题_排列 (C语言代码)浏览:1373 |
C语言训练-最大数问题 (C语言代码)浏览:648 |
【计算两点间的距离】 (C语言代码)浏览:927 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:584 |
C语言训练-求函数值 (C语言代码)浏览:600 |