我正在尝试编写一个程序,该程序在给定任意大小的矩阵的情况下将显示最长的路径,该矩阵可以从字母到字母移动,但只能移动到相邻的字母。
例如如果字母为“ E”,则可以移至“ D”或“ F”。允许您上下左右移动,但只能移动一个位置。现在,我对数字做了类似的问题,您必须找到从左上角到右下角的路径,并且我假设这将是具有更多约束的类似问题。这就是我所拥有的,我不确定如何修改它以完成该问题需要做的事情(有障碍,它只能通过0's):
def pathwithproblems(A):
paths = [[0]*len(A[0] for i in A]
if A[0][0] == 0:
paths[0][0]=1
for i in range(1, len(A)):
if A[i][0] == 0:
paths[i][0]=paths[i-1][0]
for j in range(1, len(A)):
if A[0][j] == 0:
paths[0][j]=paths[0][j-1]
for i in range(1, len(A)):
for j in range(1, len(A)):
if A[i][j] == 0:
paths[i][j]=paths[i-1][j] + paths[i][j-1]
return paths[-1][-1]
对于我的字母问题,例如,如果矩阵是:
L K M N O P Q R J
A B C D E F G H I
我的答案应该是:
JIHGFEDCBA
如果有平局,我想返回行和列索引最低的一个,如果仍然有平局,则返回任何一个都可以。任何帮助将不胜感激!
答案 0 :(得分:1)
Another way to solve this problem is to have a helper function which will calculate all the lengths of the paths having adjacent letters and then the calling function can store only the longest one.
伪代码:
helper(int[] mat, i, j, char c)
{
if i or j are outside the boundary conditions, return 0.
if difference between mat[i][j] and c is 1:
return Math.max(
helper(mat, i+1,j,mat[i][j]),
helper(mat, i-1,j,mat[i][j]),
helper(mat, i,j+1,mat[i][j]),
helper(mat, i,j-1,mat[i][j]))+1;
else return 0;}
答案 1 :(得分:0)
这等效于某些图形。所以第一步就是推导图
ABE
DCZ
将成为
A-B E
|
D-C Z
您现在可以在其中搜索最长的路径(某些解决方案应该在互联网上)