马踏过河卒 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)的路径数