题目描述
解题思路
经过一系列地方问所有路径条数,很明显是一个二维数组的动态规划问题。动态规划问题我们就要讨论dp的最终条件以及初始条件还有题目校限制条件
dp最终条件
由于棋子只能向下或者向右所以
dp[i][j]=dp[i-1][j]+dp[i][j-1]
dp初始条件
只需要赋值所有dp为0和dp[0][0]为1。边界我们会设置一个函数判断所以不用给边界赋予初值,如果你不设置函数判断你就需要给dp的边界赋予初值
题目限制条件
我们需要一个dirct存储马所可能进攻的所有位置,到走到一个点时我们需要判断
1.该点是不是马占的位置,既马的初始位置
2.该点是不是马能进攻到的位置
如果是上述两种情况则循环遍历下一次
代码
#读入数据
bx,by,ma_x,ma_y=map(int,input().strip().split())
#初始化
dp=[[0]*(by+1) for _ in range(bx+1)]
dp[0][0]=1
dirct={(-1,2),(1,2),(1,-2),(-1,-2),(-2,1),(2,1),(2,-1),(-2,-1)}
#定义函数
def check(x,y):
#判断是否越界
return x>=0 and y>=0 and x<=bx and y<=by
def ma(x,y):
if x==ma_x and y==ma_y:
return True
for dx,dy in dirct:
if x==ma_x+dx and y==ma_y+dy:
return True
return False
#开始走
for i in range(bx+1):
for j in range(by+1):
#如果马占或者马能打到则不能走
if ma(i,j):
continue
#dp[i][j]=dp[i-1][j]+dp[i][j-1]但是可能存在不可能的情况
#向下走
if check(i-1,j):
dp[i][j]+=dp[i-1][j]
if check(i,j-1):
dp[i][j]+=dp[i][j-1]
print(dp[bx][by])