解题思路(解题要求)
-
要知道马是走日字的(不会吧,不会吧,不会有人不知道马是走日字的吧(bushi)) -
一开始没有注意到需要多开店数组的长度所以吃了很大的亏,虽然开大数组会额外占用内存,但是真的不亏(就算是以吃内存为主的python也一样)
-
知道动态规划(其实只要知道dp[i][j] == dp[i - 1][j] + dp[i - 1][j]就可以了)
思考路程(作死路程)
- 定义一个cheakbored的二维数组
cheakbroad = [[0 for i in range(24)] for j in range(24)]
- 再将图里面的马的坐标输入进去,
同时推出可以攻击的位置
并将这些位置标记,
标记的方式随你自己,可以通过变为1或者-1
a,b,m,n = map(int,input().split())
cheakbroad[m + 2][n + 2] = 2
cheakbroad[m][n + 1] = 1
cheakbroad[m + 1][n] = 1
cheakbroad[m + 4][n + 1] = 1
cheakbroad[m + 4][n + 3] = 1
cheakbroad[m][n + 3] = 1
cheakbroad[m + 1][n + 4] = 1
cheakbroad[m + 3][n] = 1
cheakbroad[m + 3][n + 4] = 1
0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
1 | a | a | ||||
2 | a | a | ||||
3 | h | |||||
4 | a | a | ||||
5 | a | a | ||||
6 | f |
然后就开始了难点了,递归,动态规划,
我们开大的二维数组的目的就是为了考虑更少的边界情况,第一个问题就在于,如果这个卒一开始就被马这个地方覆盖的话,那么就直接输出0,因为你动都动不了,就乖乖被吃吧。
考虑到这样的情况,那么我们就可以展开递推式了,
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
首先展开,将最右边和最下面都变为1,(前提是没有遇到攻击点和马)
如果遇到了,那么包括这个点之后的情况就全部变为0。
dp = [[0 for row in range(24)] for roj in range(24
if cheakbroad[2][2] != 0 or cheakbroad[a + 2][b + 2] != 0:
print(0)
else:
for i in range(2,a + 3):
if cheakbroad[i][2] != 0:
break
else:
dp[i][2] = 1
for j in range(2,b + 3):
if cheakbroad[2][j] != 0:
break
再根据二维数组的遍历原则,即一个不动,内部动的原则
- 假设我们是一个一个向下遍历的,如果在遍历过程中下一个是a或者h,那么则,在进行判断,因为只有可能是两种情况,右边是危险点或不是危险点(危险就是a或者h的点)
- 如果是的话,就将这个点变为0,不是就照常
- 如果这个点就是危险点本身,那么就直接变为0
- 不需要太注意第一个题解所说的遇到危险点变为j - 2,i - 2,自上而下的遍历是不需要的~~(高傲)~~
~~ 源代码 ~~(废物写了四个小时的)
cheakbroad = [[0 for i in range(24)] for j in range(24)]#构造二维数组
dp = [[0 for row in range(24)] for roj in range(24)]
a,b,m,n = map(int,input().split())#读入数据
cheakbroad[m + 2][n + 2] = 2
cheakbroad[m][n + 1] = 1
cheakbroad[m + 1][n] = 1
cheakbroad[m + 4][n + 1] = 1
cheakbroad[m + 4][n + 3] = 1
cheakbroad[m][n + 3] = 1
cheakbroad[m + 1][n + 4] = 1
cheakbroad[m + 3][n] = 1
cheakbroad[m + 3][n + 4] = 1#标记所有的特殊点
if cheakbroad[2][2] != 0 or cheakbroad[a + 2][b + 2] != 0:#考虑边界情况
print(0)
else:
for i in range(2,a + 3):#完成初始化
if cheakbroad[i][2] != 0:
break
else:
dp[i][2] = 1
for j in range(2,b + 3):
if cheakbroad[2][j] != 0:
break
else:
dp[2][j] = 1
for j in range(3,b + 3):#开始遍历
for i in range(3,a + 3):
if cheakbroad[i + 1][j] == 1 or cheakbroad[i + 1][j] == 2:
if cheakbroad[i][j + 1] == 1 or cheakbroad[i][j + 1] == 2:
dp[i][j] = 0
else:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
if cheakbroad[i][j] == 1 or cheakbroad[i][j] == 2:
dp[i][j] = 0
else:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
print(dp[a + 2][b + 2])
如果对您有帮助的话可以点个赞吗?
๑乛◡乛๑