题解 | [NOIP2002 普及组] 过河卒 Python3
[NOIP2002 普及组] 过河卒
https://www.nowcoder.com/practice/cc1a9bc523a24716a117b438a1dc5706
import sys
# 23:28
# 动态规划 dp[i][j]为从 (0,0)到 (i,j)的条数
# 可以从上面来,也可以从左边来
# dp[i+1][j] = dp[i][j] + dp[i+1][j-1],且 (i,j), (i+1,j-1)不为马能吃掉的点,否则不加该点
n, m, x, y = list(map(int, input().split()))
dp = [[0]*(m+1) for _ in range(n+1)]
dp[0][0] = 1
# 初始化dp[0][i]
for i in range(1,m+1):
# 第一行,只能从右边走
if (abs(0-x) + abs(i-y) == 3 and x!=0 and y!=i) or (x==0 and y==i):
# 遇到马范围,不能走
dp[0][i] = 0
else:
dp[0][i] = dp[0][i-1]
for i in range(1,n+1):
# 第一列,只能从下边走
if (abs(i-x) + abs(0-y) == 3 and x!=i and y!=0) or (i==x and y==0):
# 遇到马范围,不能走
dp[i][0] = 0
else:
dp[i][0] = dp[i-1][0]
for i in range(1,n+1):
for j in range(1,m+1):
# 如果(i,j)在马能吃到的范围内,或者为马。直接什么都不处理
if (abs(i-x) + abs(j-y) == 3 and x!=i and y!=j) or (x==i and y==j):
continue
dp[i][j] = dp[i-1][j] + dp[i][j-1]
print(dp[-1][-1])
