过河卒蓝桥杯python解法(动态规划)

文章介绍了一个使用动态规划解决棋盘上计算所有可行路径的问题。通过初始化二维数组dp,并定义边界条件和马的移动规则,逐步计算每个位置的路径数量。在遍历过程中,避开马的位置和可攻击到的位置。最后输出目标位置的dp值,即所有路径数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

解题思路

经过一系列地方问所有路径条数,很明显是一个二维数组的动态规划问题。动态规划问题我们就要讨论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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值