原题链接:信息学奥赛一本通T1314-过河卒
解题思路:
注意事项:
参考代码:
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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复