C++过河卒问题

#include <iostream>
#include <cstring>
using namespace std;

int board[20][20]; // 棋盘
int dp[20][20][20][20]; // 动态规划数组

int main() {
    int x0, y0, x1, y1;
    cin >> x0 >> y0 >> x1 >> y1;  // 输入卒的起点和终点

    memset(board, 0, sizeof(board));  // 初始化棋盘

    // 初始化动态规划数组
    memset(dp, 0, sizeof(dp));
    dp[x0][y0][0][0] = 1;
    for(int i = x0; i <= x1; i++) {
        for(int j = y0; j <= y1; j++) {
            if(board[i][j] == 1) continue;  // 如果该点有障碍物则跳过
            if(i > x0) dp[i][j][i-x0][0] += dp[i-1][j][i-x0-1][0];  // 上方的状态转移
            if(j > y0) dp[i][j][0][j-y0] += dp[i][j-1][0][j-y0-1];  // 左方的状态转移
        }
    }

    cout << dp[x1][y1][x1-x0][y1-y0] << endl;  // 输出方案数

    return 0;
}

        其中,动态规划数组 dp[i][j][x][y] 表示从起点 (x0, y0) 到当前点 (i, j) ,沿途经过了 x 行、y 列,一共有多少种方案。初始状态为 dp[x0][y0][0][0] = 1,表示从起点出发,沿途未经过行或列的方案数为 1。

状态转移方程为:

dp[i][j][x][y] = dp[i-1][j][x-1][y] (如果 i > x0 && board[i][j] != 1)
                + dp[i][j-1][x][y-1] (如果 j > y0 && board[i][j] != 1)
其中,board[i][j] 表示棋盘上点 (i, j) 是否有障碍物。如果该点有障碍物,则不能通过该点。最终,需要输出 dp[x1][y1][x1-x0][y1-y0]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Galaxy银河

你的鼓励是我的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值