P1002 [NOIP2002 普及组] 过河卒 题解

dp 入门题

题目大概要求

  • 计算从起点 (0, 0) 到终点 (n, m) 的方案总数
  • 每次只能向下货向右走一格
  • 马本身的位置及其一次移动后的位置不可经过

这是一道很简单的 dp 题,第 (x, y) 点的方案总数为 (x - 1, y) 点与 (x, y - 1) 点的方案和,动态转移方程为:

f(x, y) = f(x - 1, y) + f(x, y - 1)

再额外对被马覆盖的点进行单独处理即可,代码如下:

#include <cstdio>
using namespace std;
int x_end, y_end, x_horse, y_horse;
long long g[25][25]; // 一个二维数组,储存到每个点的方案数,需要开 long long
bool vis[25][25]; // 表示每个点是否走过
int dx[8] = {0, -1, -2, -2, -1, 1, 2, 2, 1};
int dy[8] = {0, -2, -1, 1, 2, 2, 1, -1, -2};
// 方向数组,表示马走一步的偏移量
int main() {
    scanf("%d%d%d%d", &x_end, &y_end, &x_horse, &y_horse);
    x_end += 2; y_end += 2; x_horse += 2; y_horse += 2; // 防止数组越界,因为马走一步行和列移动最远的距离为2,所以要加上2
    for (int i = 0; i <= 8; i++) 
        vis[x_horse + dx[i]][y_horse + dy[i]] = 1;
    // 对卒不能走到的点进行标记
    g[2][1] = 1; // 对图进行初始化
    for (int i = 2; i <= x_end; i++) 
        for (int j = 2; j <= y_end; j++)
            if (vis[i][j] == 0)
                g[i][j] = g[i - 1][j] + g[i][j - 1]; // 如果这个点可走,那么计算走到此点的总方案数
    printf("%lld", g[x_end][y_end]); 
    return 0;
}

抱天下工作室招人
要求:

  1. 年龄不限
  2. 有担当
  3. 有自己擅长的编程语言
  4. 愿意接受不定薪资(¥RMB)
  5. 有奉献精神
  6. 服从集体
  7. 敢于发言

有意者加Q群:536950507

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值