[NOIP2002 普及组] 过河卒题解

文章介绍了如何使用C++编程解决涉及动态规划和组合数学的问题,计算从点A到点B的路径数,排除马控制点的影响。代码给出了计算总路径数和减去马控制路径数的具体步骤。

这个问题是一个典型的组合问题,涉及到动态规划或者组合数学。卒从点 A 到点 B 的路径数可以通过计算从 A 到 B 的路径中不经过马控制点的路径数,然后减去那些经过马控制点的路径数来解决。

马控制的点包括马的位置本身和它能够一步跳跃到达的点。马的移动规则是“日”字形,即可以移动到正上方两个单位再向左或右一个单位,或者正上方一个单位再向左或右两个单位,反之亦然。

我们可以先计算从 A 到 B 的总路径数,然后减去那些会经过马控制点的路径数。

以下是解决这个问题的 C++ 代码:

#include <iostream>
using namespace std;

// 计算阶乘
int fact(int n) {
    int result = 1;
    for (int i = 1; i <= n; ++i) {
        result *= i;
    }
    return result;
}

// 计算组合数
int comb(int n, int k) {
    return fact(n) / (fact(k) * fact(n - k));
}

int main() {
    int n, m, x, y;
    cin >> n >> m >> x >> y;

    // 计算从 (0, 0) 到 (n, m) 的总路径数
    int totalPaths = comb(n + m, n);

    // 马控制的行数和列数
    int controlledRows = min(n, x) + 1;
    int controlledCols = min(m, y) + 1;

    // 计算从 (0, 0) 到马控制点的路径数
    int controlledPaths = comb(x + y, x);

    // 如果马控制的行数或列数小于马的坐标,需要减去额外的路径数
    if (n > x) {
        controlledPaths -= comb(x + (m - y), x);
    }
    if (m > y) {
        controlledPaths -= comb(y + (n - x), y);
    }

    // 输出最终的路径数
    cout << totalPaths - controlledPaths << endl;

    return 0;
}

这段代码首先计算了从起点到终点的总路径数,然后计算了那些会经过马控制点的路径数。最后,它输出了两者的差值,即卒能够到达终点的路径数。

根据样例输入 #1,这段代码应该输出 6,表示有 6 条路径可以从起点到达终点而不经过马控制的点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值