Kid Phantom 2024-06-09 20:30 采纳率: 45.5%
浏览 3

c++马拦过河卒代码找错

题目描述
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入
一行四个数据,分别表示B点坐标和马的坐标。(保证所有的数据有解)
输出
一个数据,表示所有的路径条数。
样例输入 Copy
6 6 3 3
样例输出 Copy
6

#include<bits/stdc++.h>
#define MX 200
using namespace std;
long long i,j,a[MX + 10][MX + 10];
int main()
{
    int n,m,x,y,ans = 0;
    int i,j,f = 0;
    cin >> n >> m >> x >> y;
    a[0][0] = 1;
    for (i = 0;i <= n;i++)
    {
        if ((i == x - 2 && 0 == y - 1)||(i == x - 2 && 0 == y + 1)||(i == x + 2 && 0 == y - 1)||(i == x + 2 && 0 == y + 1)||(i == x - 1 && 0 == y + 2)||(i == x - 1 && 0 == y - 2)||(i == x + 1 && 0 == y + 2)||(i == x + 1 && 0 == y - 2)||(0 == x && 0 == y))
        {
            break;
        }
        a[i][0] = 1;
    }
    for (i = 0;i <= m;i++)
    {
        if ((0 == x - 2 && i == y - 1)||(0 == x - 2 && i == y + 1)||(0 == x + 2 && i == y - 1)||(0 == x + 2 && i == y + 1)||(0 == x - 1 && i == y + 2)||(0 == x - 1 && i == y - 2)||(0 == x + 1 && i == y + 2)||(0 == x + 1 && i == y - 2)||(0 == x && i == y))
        {
            break;
        }
        a[0][i] = 1;
    }
    for (i = 1;i <= n;i++)
    {
        for (j = 1;j <= m;j++)
        {
            if (((i == x - 2 && j == y - 1)||(i == x - 2 && j == y + 1)||(i == x + 2 && j == y - 1)||(i == x + 2 && j == y + 1)||(i == x - 1 && j == y + 2)||(i == x - 1 && j == y - 2)||(i == x + 1 && j == y + 2)||(i == x + 1 && j == y - 2)||(i == x && j == y)))
            {
                a[i][j] = 0;
            }
            else
            {
                a[i][j] = a[i - 1][j] + a[i][j - 1];
            }            
        }
    }
    cout << a[n][m] << endl;
    return 0;
}
```c++


```

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-09 20:30
    关注

    引自免费微信小程序:皆我百晓生

    针对你提供的代码,有几个关键的地方需要修正以确保正确性。主要问题在于边界条件处理和马的控制点逻辑。下面是一个修正后的代码版本,它应该能更准确地解决“马拦过河卒”的问题:

    #include <bits/stdc++.h>
    #define MX 20
    using namespace std;
    
    long long dp[MX + 10][MX + 10];
    int n, m, x, y;
    
    void init() {
        memset(dp, 0, sizeof(dp));
    }
    
    bool isControlled(int i, int j) {
        // Check if the current position is controlled by the horse
        int dx[] = {-2, -1, 1, 2, -2, -1, 1, 2};
        int dy[] = {1, 2, 2, 1, -1, -2, -2, -1};
        
        for (int k = 0; k < 8; ++k) {
            int nx = x + dx[k], ny = y + dy[k];
            if (nx == i && ny == j) return true;
        }
        return false;
    }
    
    int main() {
        init();
        cin >> n >> m >> x >> y;
        dp[0][0] = 1;
    
        for (int i = 0; i <= n; ++i) {
            for (int j = 0; j <= m; ++j) {
                // If this point is controlled by the horse, set its value to 0
                if (isControlled(i, j)) continue;
                
                // Update DP values
                if (i > 0) dp[i][j] += dp[i - 1][j];
                if (j > 0) dp[i][j] += dp[i][j - 1];
            }
        }
    
        cout << dp[n][m] << endl;
        return 0;
    }
    

    解释

    • 初始化init()函数用于初始化DP数组,确保所有值都是0。
    • 控制点检查isControlled()函数用于确定当前位置是否被马控制。通过遍历马的所有可能移动方向来实现。
    • 动态规划更新:主循环中,对于每个点,我们首先检查它是否被马控制。如果是,则跳过这个点。否则,我们更新该点的DP值,即从左边和上边的点转移过来的值之和。

    这个版本的代码应该能更准确地计算从A点到B点的路径数量,同时考虑到马的控制点限制。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月9日

悬赏问题

  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码
  • ¥15 AutoDL无法使用docker install吗?
  • ¥15 cups交叉编译后移植到tina sdk的t113,只需要实现usb驱动打印机,打印pdf文件
  • ¥30 关于#wireshark#的问题:需要网络应用流量数据集需要做长度序列的实验,需要与应用产生的会话的数据包的长度,如视频类或者聊天类软件
  • ¥15 根据上述描述表示泥浆密度沿着管路的长度方向在不断变化,如何来表示泥浆密度随管路的变化(标签-matlab|关键词-流计算)
  • ¥21 matlab可以把图像数据转换为小波分析吗
  • ¥60 基于香农编码的图像压缩算法实现
  • ¥15 matlabGUI绘制一个函数与其导数的图像
  • ¥20 大数据采集用Python爬取猫眼电影数据