1921 NOIP2002 普及:第四题 过河卒

该博客主要介绍了一个棋盘游戏中关于卒子移动的问题。卒子从点A开始,需要到达点B,但途中不能经过被对方马控制的点。博客提供了两种解决方案,一种是非高精度的,另一种是高精度的C++代码实现,用于计算不受限制的可行路径数量。输入包括B点和马的位置坐标,输出是可行路径的总数。

【题目描述】

如图,A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。

同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为方马的控制点。例如上图C点上的马可以控制9个点(图中的P1,P2...P8和C)。卒不能通过对方的控制点。

棋盘用坐标表示,A点(0,0)、B点(n, m)(n,m为不超过20的整数,并由键盘输入),同样马 的位置坐标是需要给出的(约定:C≠A,同时C≠B)。现在要求你计算出卒从A点能够到达B点的路径的条数。

【输入】

B点的坐标(n,m)以及对方马的坐标(X,Y) {不用判错}

【输出】<

NOIP(全国青少年信息学奥林匹克联赛)2002普及组第二是“过河”。以下是该目的详细内容: ### 【问描述】 棋盘上 $A$ 点有一个过河,需要走到目标 $B$ 点。行走的规则:可以向下、或者向右。同时在棋盘上 $C$ 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河”。 棋盘用坐标表示,$A$ 点 $(0, 0)$、$B$ 点 $(n,m)$,同样马的位置坐标是需要给出的。 现在要求你计算出从 $A$ 点能够到达 $B$ 点的路径的条数,假设马的位置是固定不动的,并不是走一步马走一步。 ### 【输入格式】 一行四个数据,分别表示 $B$ 点坐标和马的坐标。 ### 【输出格式】 一个数据,表示所有的路径条数。 ### 【输入样例】 ```plaintext 6 6 3 3 ``` ### 【输出样例】 ```plaintext 6 ``` ### 【数据范围】 对于 $100\%$ 的数据,$1 \leq n,m \leq 20$,$0 \leq$ 马的坐标 $\leq 20$。 ### 【提示】 结果可能很大! 以下是使用 Python 解决该问的示例代码: ```python n, m, hx, hy = map(int, input().split()) # 初始化马的控制点 horse_ctrl = [[False] * 21 for _ in range(21)] # 马本身的位置 horse_ctrl[hx][hy] = True # 马的 8 个跳跃方向 dx = [-2, -2, -1, -1, 1, 1, 2, 2] dy = [-1, 1, -2, 2, -2, 2, -1, 1] for i in range(8): nx = hx + dx[i] ny = hy + dy[i] if 0 <= nx <= 20 and 0 <= ny <= 20: horse_ctrl[nx][ny] = True # 初始化动态规划数组 dp = [[0] * 21 for _ in range(21)] dp[0][0] = 1 if not horse_ctrl[0][0] else 0 # 动态规划计算路径条数 for i in range(n + 1): for j in range(m + 1): if horse_ctrl[i][j]: continue if i > 0: dp[i][j] += dp[i - 1][j] if j > 0: dp[i][j] += dp[i][j - 1] print(dp[n][m]) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值