救救Python党吧!

P1002 [NOIP2002 普及组] 过河卒

菜鸡蒙个:会不会是for循环问题
by Lenry_Viss @ 2021-02-11 20:38:58


@[二向猴子](/user/333724) 我很负责任地告诉你,python二维列表经常挂
by 天命之路 @ 2021-02-11 20:56:10


需要用numpy 的array来替代二维列表 ``` import numpy f=numpy.array([[None]*m for i in range(n)])
by 天命之路 @ 2021-02-11 20:57:43


@[天命之路](/user/226435) 貌似也挂了 https://www.luogu.com.cn/record/46507553
by IL_2 @ 2021-02-11 21:06:33


啊哈,控制点少写俩! 然鹅。。。 https://www.luogu.com.cn/record/46512092 只过#2? 还请各位大佬看看本蒟蒻还能不能抢救一下。。。 ## 附代码 ```python import numpy def find(m,n,x,y): f=numpy.array([[None]*m for i in range(n)])#创建列表 #设置边界 for i in range(n): f[i][0] = 1 for i in range(m): f[0][i] = 1 #规定控制点 f[x+1][y+2] = 0 f[x+1][y-2] = 0 f[x-1][y+2] = 0 f[x-1][y-2] = 0 f[x+2][y+1] = 0 f[x+2][y-1] = 0 f[x-2][y+1] = 0 f[x-2][y-1] = 0 f[x][y] = 0 #遍历 for y in range(n): for x in range(m): if f[y][x] == None: f[y][x] = f[y][x-1]+f[y-1][x]#状态转移方程 return f[-1][-1] m,n,x,y = map(int,input().split()) print(find(m+1,n+1,x,y)) ```
by IL_2 @ 2021-02-12 10:46:32


@[二向猴子](/user/333724) 样例也过了
by IL_2 @ 2021-02-12 10:47:20


已修改,#2#5AC,其他WA ## 附代码 ```python m,n,x,y = map(int,input().split()) m+=1 n+=1 f = [[None]*(n) for i in range(m)] #设置边界 for i in range(n): f[0][i] = 1 for i in range(m): f[i][0] = 1 #设置控制点 f[x+1][y+2] = 0 f[x+1][y-2] = 0 f[x-1][y+2] = 0 f[x-1][y-2] = 0 f[x+2][y+1] = 0 f[x+2][y-1] = 0 f[x-2][y+1] = 0 f[x-2][y-1] = 0 f[x][y] = 0 #遍历,更新值 for a in range(m): for b in range(n): if f[a][b] is None: f[a][b] = f[a-1][b] + f[a][b-1] #输出 print(f[-1][-1]) ```
by IL_2 @ 2021-02-12 17:39:44


才发现控制点可能减成负数。。。 #1,2,5AC,其他WA ## 附代码 ```python m,n,x,y = map(int,input().split()) m+=1 n+=1 f = [[None]*n for i in range(m)] #设置边界 for i in range(n): f[0][i] = 1 for i in range(m): f[i][0] = 1 #设置控制点 if x-1 >= 0 and y-2 >= 0: f[x-2][y-1] = 0 f[x-1][y-2] = 0 if x+1 < m and y+2 < n: f[x+1][y+2] = 0 f[x+2][y+1] = 0 if x-1 >= 0 and y+2 < n: f[x-1][y+2] = 0 if y-2 >= 0 and x+1 < m: f[x+1][y-2] = 0 if x+2 < m and y-1 >= 0: f[x+2][y-1] = 0 if x-2 >= 0 and y+1 < n: f[x-2][y+1] = 0 f[x][y] = 0 #遍历,更新值 for a in range(m): for b in range(n): if f[a][b] is None: f[a][b] = f[a-1][b] + f[a][b-1] #输出 print(f[-1][-1]) ```
by IL_2 @ 2021-02-12 18:00:21


# AC! 刚刚发现控制点在(m,0)或(0,n)上的情况没有处理,最终会变成这样: ![图示](https://cdn.luogu.com.cn/upload/image_hosting/gaprp7kq.png) ## 然鹅,为了避免评论区题解,此处只给出修正代码: ```python for i in range(n): if f[0][i] == 0: for t in range(i,n):#将控制点右侧无法到达的边界设为0 f[0][t] = 0 for i in range(m): if f[i][0] == 0: for t in range(i,m):#将控制点上侧无法到达的边界设为0 f[t][0] = 0 ```
by IL_2 @ 2021-02-20 10:00:16


@[二向猴子](/user/333724) 非常感谢,我也是34WA,然后发现对于第一行的控制点和第一列的控制点我都没有在下边和右边做处理。
by zzuBobby @ 2021-04-10 23:03:31


|