题目描述
如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。
例如上图 C 点上的马可以控制 99 个点(图中的 P1,P2,⋯P8 和 �C)。卒不能通过对方马的控制点。
棋盘用坐标表示,A 点(0,0)(0,0)、B 点(n,m)(n,m≤20),同样马的位置坐标是需要给出的。
现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。。
输入描述
一行四个正整数,分别表示 B 点坐标和马的坐标。
输出描述
一个整数,表示所有的路径条数。
输入输出样例
示例 1
输入
6 6 3 3
输出
6
思路:这道题如果用dfs,复杂度太高,所以用动态规划,每步更新相应格子的dp数组,一直到终点B
如何判断这一点是否是马能走的点? 根据题意,马能走到相距两格的对角线位置,即如果相对于马的坐标(x,y)来说,它能走到的就是(x-2,y-1),(x-2,y+1),(x+2,y-1),(x+2,y+1),(x+1,y-2),(x+1,y+2),(x-1,y+2),(x-1,y-2)这八个点,也就是说在矩阵中对于马的坐标来说,这八个点不能走,我们可以将这八个点的dp[i][j]置0
还有需要注意的是:对于这道题来说,如果马的坐标在第一行和第二行,那么它可跳跃的坐标有可能为负数,为了避免这种情况的出现,我们可以给矩阵中的所有点横纵坐标+2
此时起点坐标为(2,2)
dp表达式为
当[i][j]不能走时,dp[i][j]=0
当[i][j]能走时,dp[i][j]=dp[i-1][j]+dp[i][j-1]
dp=[[0]*25 for i in range(25)]
s=[[0]*25 for i in range(25)]
bx,by,mx,my = map(int,input().split())
bx+=2
by+=2
mx+=2
my+=2
dp[2][1]=1#初始化dp数组,在下面求dp[2][2]时用到
s[mx][my]=1
s[mx-2][my-1]=1
s[mx+2][my-1]=1
s[mx+2][my+1]=1
s[mx-2][my+1]=1
s[mx-1][my+2]=1
s[mx-1][my-2]=1
s[mx+1][my+2]=1
s[mx+1][my-2]=1
for i in range(2,bx+1):
for j in range(2,by+1):
if s[i][j]==1:
dp[i][j]=0
else:
dp[i][j]=dp[i-1][j]+dp[i][j-1]
print(dp[bx][by])