如图,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
我们定义状态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 xn or ym: 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])
Copyright © 2023 leiyu.cn. All Rights Reserved. 磊宇云计算 版权所有 许可证编号:B1-20233142/B2-20230630 山东磊宇云计算有限公司 鲁ICP备2020045424号
磊宇云计算致力于以最 “绿色节能” 的方式,让每一位上云的客户成为全球绿色节能和降低碳排放的贡献者