假设我有一个只有0和1的矩阵,像这样:
0 0 1 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 1 0
我从第一列开始,移动到下一列只有三个选项,它们是[i+1][j+1] or [i][j+1] or [i-1][j+1]
。不允许撞入1
。它需要检查这三个方向,然后决定向哪里移动。
最好我想去低,所以[i-1][j+1]
是第一个考虑的选择。如果不是,则是[i][j+1]
,如果不是,则是[i+1][j+1]
。如果没有办法在不冲突1
的情况下继续前进,则没有解决方案,则该函数返回0
。目标是到达矩阵的最后一列,在尽可能低的行中,并返回行号。
我正在写一个代码来告诉它这一点,但我不知道每个if
条件填充什么。我如何让它沿着这些方向移动,直到矩阵的末端?
def jumpFromOnes(matrix,i,j):
if(mat[i][j] == 0):
if(matrix[i+1][j+1] !=1 ):
< fill here >
elif (matrix[i][j+1] !=1):
< fill here >
elif (i==0 or matrix[i-1][j+1]!=1):
< fill here >
# This is to tell it where to stop, if it got to the last column or the last row. Dont know if it's correct though.
if(j+1<len(matrix[0])):
jumpFromOnes(matrix,i,j+1)
elif(i+1<len(matrix)):
jumpFromOnes(matrix,i+1,0)
else:
return
将i
和j
索引更改为i+1
,i-1
或j+1
,具体取决于您要"跳转"到哪个索引。
您应该在循环中执行此操作,以便它多次执行此操作。(如果这是你想要的)
如果它在函数中,则将其返回到外部作用域,以便索引不断更改。(即函数外的i
和j
也应该更改)
编辑:递归函数
def jumpFromOnes(mat,i,j):
if i==len(matrix)-1: return "Reached end at bottom"
if j==len(matrix[0])-1: return "Reached end at right"
if not mat[i+1][j+1]: return jumpFromOnes(mat,i+1,j+1)
if not mat[i][j+1]: return jumpFromOnes(mat,i,j+1)
if not mat[i-1][j+1]: return jumpFromOnes(mat,i-1,j+1)
return "Impossible to continue"
这将首先检查它是否到达其中一个端点,然后如果矩阵在新位置i+1
,i-1
或j+1
等于0(如not 1 -> 0
和not 0 -> 1
,在python中分别等于False
或True
),我们在该新位置返回jumpFromOnes,如果没有新位置可用,我们返回impossible to continue。