洛谷——过河卒问题

过河卒题目分析区域中各个点的初始化马控制点的处理求解每一个点的路径数第二种方法:DFS定义dfs函数进行路径搜索主函数中判断好马的控制点棋盘上 AA 点有一个过河卒,需要走到目标 BB 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 CC 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,AA 点 (0, 0)(0,0)、BB 点 (n, m)(n,m),同样马的位置坐标是需要给出的。现在要求你计算出卒从 AA 点能够到达 BB 点
摘要由CSDN通过智能技术生成

棋盘上 AA 点有一个过河卒,需要走到目标 BB 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 CC 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示,AA 点 (0, 0)(0,0)、BB 点 (n, m)(n,m),同样马的位置坐标是需要给出的。

在这里插入图片描述

现在要求你计算出卒从 AA 点能够到达 BB 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入格式
一行四个正整数,分别表示 BB 点坐标和马的坐标。

输出格式
一个整数,表示所有的路径条数。

输入输出样例

  • 输入 6 6 3 3
  • 输出 6

题目分析

首先必须清楚他要我们输入的是终点坐标以及马的位置,起点是确定的AA(0,0),然后我们需要知道本题让我们求的是所有的路径数,这样,我们最先想到的可能就是深度优先搜索dfs了,当然动态规划也是一个不错的选择,因为本题中卒子运动到每一个点的状态是与前面一个点的状态关系是很容易得出来的,也就是,当没有任何限制的时候,此时如果卒子运动到了f[i][j]位置,那么f[i][j] = f[i-1][j] + f[i][j-1] (因为卒子不是往下走就是往右走),但是本题目中有限制,就是不能踩到马的控制点。

区域中各个点的初始化

一开始区域马的位置定义为-1,判断区域的每一行和每一列中是否包含马的控制点,如果是,则该位置的路径数定为-1,否则该位置的路径数定为1,区域内其他的位置的路径数都定义为零(只要定义二维数组即可,因为一定义就会赋值为0)。

马控制点的处理

我们需要先定义一个数组来存放以马为中心,马走一步之后可以到达的点的坐标, 即马的控制点(一共8个点),在定义一个函数来判断卒子是否已经走到了马的控制点,以及马的控制点是否已经越界了,如果不越界,就将让它等于-1。

求解每一个点的路径数

遍历每一个点,找到从原点到达区域内任意一点的路径数。
双重循环中做如下处理 :卒子凡是到了等于-1的位置就用跳过,继续遍历下一个点,由于每一个点的路径由上一个点的路径来递推,而上一个点可能是来自上方,也可能来自左方,因此,需要分别判断上方或者左方的点的位置的值是否为-1,如果不是,就加上上方或者左方的点的路径数,最终输出到达终点的路径数即可。

#include <bits/stdc++.h>
using namespace std;
ll bx, by, mx, my;
ll pan[25][25];
ll local[8][2] = {
    {
   1, 2} , {
   2, 1} , {
    -1, 2} , {
   1, -2} , {
   2, -1} , {
   -2 , 1}, {
   -1 , -2} , {
   -2, -1} };
void judge() {
   
    pan[mx][my] = -1;
    for (int i = 0; i < 8; i++) {
   
        if 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是C语言洛谷p1002过河卒的代码实现和注释解析: ```c #include <stdio.h> #define MAX 21 // 定义最大值 int main() { int n, m, xh, yh, i, j, k; long long map[MAX][MAX] = {0}; // 定义地图,初始化为0 scanf("%d %d %d %d", &n, &m, &xh, &yh); // 输入信息 map[xh][yh] = -1; // 标记障碍物 for (k = 0; k < 3; k++) { // 遍历3个方向 switch (k) { case 0: i = 2; j = 1; break; // 方向1 case 1: i = 1; j = 2; break; // 方向2 case 2: i = 1; j = 1; break; // 方向3 } if (xh - i >= 0 && yh - j >= 0) { // 判断是否越界 map[xh - i][yh - j] = -1; // 标记障碍物 } if (xh + i <= n && yh + j <= m) { // 判断是否越界 map[xh + i][yh + j] = -1; // 标记障碍物 } } map[0][0] = 1; // 起点为1 for (i = 0; i <= n; i++) { // 遍历行 for (j = 0; j <= m; j++) { // 遍历列 if (map[i][j] != -1) { // 判断是否为障碍物 if (map[i - 1][j] != -1) { // 上可通过 map[i][j] += map[i - 1][j]; // 累加上方格子的值 } if (map[i][j - 1] != -1) { // 左可通过 map[i][j] += map[i][j - 1]; // 累加左方格子的值 } } } } printf("%lld\n", map[n][m]); // 输出结果 return 0; } ``` 注释解析: 1. 定义了一个二维数组`map`,用于存储地图信息,初始化为0。 2. 输入了4个整数,分别为地图的行数`n`、列数`m`、卒的初始位置`xh`、`yh`。 3. 标记了障碍物,即卒不能到达的位置。 4. 遍历了3个方向,分别为向上走2步、向左走1步;向上走1步、向左走2步;向上走1步、向左走1步。如果卒可以到达该位置,则标记为障碍物。 5. 起点的值为1,表示只有一种走法。 6. 遍历整个地图,如果该位置不是障碍物,则累加上方格子和左方格子的值。 7. 输出结果,即终点的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

追梦_赤子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值