过河卒 蓝桥杯 755

时间:2021-03-13 01:28:53

题目描述

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

过河卒 蓝桥杯 755

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

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

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

 

输入描述

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

输出描述

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

输入输出样例

示例 1

输入

6 6 3 3

输出

6

 思路:这道题如果用dfs,复杂度太高,所以用动态规划,每步更新相应格子的dp数组,一直到终点B

如何判断这一点是否是马能走的点? 根据题意,马能走到相距两格的对角线位置,即如果相对于马的坐标(x,y)来说,它能走到的就是(x-2,y-1),(x-2,y+1),(x+2,y-1),(x+2,y+1),(x+1,y-2),(x+1,y+2),(x-1,y+2),(x-1,y-2)这八个点,也就是说在矩阵中对于马的坐标来说,这八个点不能走,我们可以将这八个点的dp[i][j]置0

还有需要注意的是:对于这道题来说,如果马的坐标在第一行和第二行,那么它可跳跃的坐标有可能为负数,为了避免这种情况的出现,我们可以给矩阵中的所有点横纵坐标+2

此时起点坐标为(2,2)

dp表达式为

当[i][j]不能走时,dp[i][j]=0

当[i][j]能走时,dp[i][j]=dp[i-1][j]+dp[i][j-1]

dp=[[0]*25 for i in range(25)]
s=[[0]*25 for i in range(25)]
bx,by,mx,my = map(int,input().split())
bx+=2
by+=2
mx+=2
my+=2
dp[2][1]=1#初始化dp数组,在下面求dp[2][2]时用到
s[mx][my]=1
s[mx-2][my-1]=1
s[mx+2][my-1]=1
s[mx+2][my+1]=1
s[mx-2][my+1]=1
s[mx-1][my+2]=1
s[mx-1][my-2]=1
s[mx+1][my+2]=1
s[mx+1][my-2]=1
for i in range(2,bx+1):
  for j in range(2,by+1):
    if s[i][j]==1:
      dp[i][j]=0
    else:
      dp[i][j]=dp[i-1][j]+dp[i][j-1]
print(dp[bx][by])