在矩阵中找到相邻字母的最长路径

时间:2018-12-03 23:32:03

标签: python python-3.x matrix data-structures dynamic-programming

我正在尝试编写一个程序,该程序在给定任意大小的矩阵的情况下将显示最长的路径,该矩阵可以从字母到字母移动,但只能移动到相邻的字母。

例如如果字母为“ 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

如果有平局,我想返回行和列索引最低的一个,如果仍然有平局,则返回任何一个都可以。任何帮助将不胜感激!

2 个答案:

答案 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

您现在可以在其中搜索最长的路径(某些解决方案应该在互联网上)