马拦过河卒(递推)

本文介绍了如何使用递推方法解决棋盘问题‘马踏过河卒’,即计算卒从A点到B点避开马的控制点的路径条数。通过分析卒的行走规则,建立二维数组的递推公式,并设置了递推边界条件,避免了盲目搜索导致的时间超限问题。同时,提到了代码改进方案和他人对此问题的思考链接。
摘要由CSDN通过智能技术生成

马踏过河卒 SDUTOJ1265

  • 问题:棋盘上A点有一个过河卒,需要走到目标B点。

 

  • 卒行走的规则:可以向下、或者向右。 同时在棋盘上的任一点有一个对方的马(如下图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点(如下图中的C点和P1,P2,……,P8)。

 

  • 卒不能通过对方马的控制点。

 

  • 棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。

 

  • 编程:从键盘输入n,m,计算出卒从A点能够到达B点的路径的条数。

 

 

马踏过河卒是一道很老的题目,一些程序设计比赛中也经常出现过这一问题的变形。

 

一看到这种类型的题目容易让人想到用搜索来解决,但盲目的搜索仅当n,m=15就会超时。

 

可以试着用递推来进行求解。

 

根据卒行走的规则,过河卒要到达棋盘上的一个点,只能有两种可能:从左边过来(左点)或是从上面过来(上点)

根据加法原理,过河卒到达某一点的路径数目,就等于其到达其相邻的上点和左点的路径数目之和,因此可用逐列(或逐行)递推的方法求出从起点到终点的路径数目。障碍点(马的控制点)也完全适用,只要将到达该点的路径数目设置为0即可。

 

分析:

用二维数组元素f[i][j]表示到达点(i,j)的路径数目。

用g[i][j]表示点(i,j)是否是对方马的控制点。  

g[i][j]=0 非马控制点               g[i][j]=1 马控制点

可以得到如下的递推关系式:

(1)f[i][j] = 0 当g[i][j]=1,马控制点(i,j)路径数为0

(2)f[i][0] = f[i-1][0] 当i>0, g[i][j]=0 非马控制点,首列下点(i,0)的路径数为其上点(i-1,0)的路径数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值