过河卒-蓝桥杯-动态规划

简介: 过河卒-蓝桥杯-动态规划

题目描述


如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。

例如上图 C 点上的马可以控制 9 个点(图中的P1,P2,⋯P8 和 C)。卒不能通过对方马的控制点。

棋盘用坐标表示,A 点(0,0)、B 点$(n,m)(n,m \leq 20)$,同样马的位置坐标是需要给出的。

现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。


输入描述


一行四个正整数,分别表示 B 点坐标和马的坐标。


输出描述


一个整数,表示所有的路径条数。


输入输出样例


示例 1

输入

6 6 3 3

输出

6

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

思路


我们定义状态dp[][]为卒子走到坐标(i,j)时能走的条数

如果不考虑马的控制,i,j) 点的路径条数等于它上面和左边的路径条数之和,即

我们这道题中要考虑马的位置,当卒子走到马的控制点时,我们跳过这个点,让这个点还为0,不会影响控制点下边和左边的dp[][],这样我们就可以继续计算其他点的dp[][]的值了。


代码


1. n,m,x,y=map(int,input().split())
2. 
3. dp=[[0]*40 for i in range(40)] 
4. #可以控制的八个点和初始位置
5. dx=[0,2,1,-1,-2,-2,-1,1,2]
6. dy=[0,1,2,2,1,-1,-2,-2,-1]
7. 
8. lst=[[0,0]]
9. 
10. def check(x,y):
11. global n,m
12. if x<0 or x>n or y<0 or y>m:
13. return False
14. else:
15. return True
16. 
17. #走到(0,0)位置的路只有一条
18. dp[0][0]=1
19. for i in range(9):
20.     X=x+dx[i]
21.     Y=y+dy[i]
22. if check(X,Y)==False:
23. continue
24. else:
25.         lst.append([X,Y])
26. 
27. for i in range(0,n+1):
28. for j in range(0,m+1):
29. if [i,j] in lst:
30. continue
31. else:   
32.             dp[i][j]=dp[i-1][j]+dp[i][j-1]          
33. print(dp[n][m])
目录
相关文章
|
1月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
5月前
蓝桥杯动态规划每日一题
蓝桥杯动态规划每日一题
|
5月前
|
Java
蓝桥杯-动态规划专题-子数组系列,双指针
蓝桥杯-动态规划专题-子数组系列,双指针
|
5月前
蓝桥杯-动态规划-子数组问题
蓝桥杯-动态规划-子数组问题
|
5月前
蓝桥杯动态规划-第五弹 最大子数组和 买卖股票最佳时机IV 第N个泰波那契数 环形数组
蓝桥杯动态规划-第五弹 最大子数组和 买卖股票最佳时机IV 第N个泰波那契数 环形数组
蓝桥杯动态规划第三弹-路径问题进阶2.0
蓝桥杯动态规划第三弹-路径问题进阶2.0
蓝桥杯必备动态规划第二弹-路径问题进阶
蓝桥杯必备动态规划第二弹-路径问题进阶
蓝桥杯必备——动态规划“路径问题”以及这种题的小结(二)
蓝桥杯必备——动态规划“路径问题”以及这种题的小结
蓝桥杯必备——动态规划“路径问题”以及这种题的小结(一)
蓝桥杯必备——动态规划“路径问题”以及这种题的小结
|
测试技术 Python
蓝桥杯丨动态规划
蓝桥杯丨动态规划
60 0