使用回溯使2d数组相等

时间:2019-06-22 14:26:47

标签: python backtracking

我在尝试在python中使用回溯时遇到问题。 这是问题所在:例如,我只需要移动零(上,下,左,右)就可以使两个矩阵相等:

Matrix1:  [ [1,2],
            [3,0]]
Matrix2:  [ [1,0],
            [3,2]]

移动数量:3(最多只能使用x个移动)

矩阵1必须等于矩阵2。

答案应为:

'u' (move zero upwards)

我不知道如何开始:c

PS:抱歉,这不是我的母语,请随时纠正我。

Matrix size: Number of movements: First Matrice: Final Matrice:'

如果输入是: 3 3 1 2 3 4 5 6 7 8 0

1 2 3 4 0 5 7 8 6

输出应为: ul(零位置更改为6,向上移动,然后零位置更改为5,向左移动)。

我不怎么使用回溯。

我正在尝试做这样的事情:

def safe(x, y, n): 
    if x>=0 and x<n and y>=n and y<n:  
        return True  
    return False  

def whereszero(maze): 

    for x in range(len(maze)):  
        for y in range(len(maze)):  
            if maze[x][y]==0:  
              return x, y  



def main():  
    n=int(input("Matrice size:"))  #matrice dimensions  
    matrice1=[int(x) for x in input().split()] for j in range(n)]  
    matrice2=[int(x) for x in input().split()] for j in range(n)]  
    max=int(input("maximum movements:"))  
    zerox, zeroy=whereszero(matrice1) #returns zero index  
    if solved(matrice1, matrice2, zeroX, zeroY, zeroX, zeroY, 0, max, b, list)==False:  
        print("No solution")  
        return False  
    print("Anwser:", list)  
    return True  


def solved(mat1, mat2, zeroinx, zeroiny, x, y, i, max, movements, list):  
    if mat1==mat2:  
        return True  
    if safe(x, y, len(mat1)) and i<=max
        mat1[x][y], mat1[zeroinx][zeroiny]=mat1[zeroinx][zeroiny], mat1[x][y]  
        zeroinx=x  
        zeroint=y  
        list.append("movements")  
            if solved(mat1, mat2, zeroinx, zeroiny, x+1, y, i+1, max, d, list): #try moving downwards  
                return True  
            if solved(mat1, mat2, zeroinx, zeroiny, x-1, y, i+1, max, u, list): #try moving upwards...  
                return True  
            if solve(mat1, mat2, zeroinx, zeroiny, x, y-1, i+1, max, l, list): #left
                return True  
            if solve(mat1, mat2, zeroinx, zeroiny, x, y+1, i+1, max, r, list): #right, i is the number of moviments tried, max is maximum number of movements  
                return True  

        return False # How do I backtrack?  


main()   `

1 个答案:

答案 0 :(得分:0)

回溯是一种技术,简而言之,您的算法会做出一些可能的选择,但是,如果该选择没有成功,则会返回(因此使用回溯名称)并尝试下一个可能的选择,直到成功或尝试所有选择。伪代码的典型解决方案:

func run(state):
    if success: return true
    for choice in possible-choices(state):
        new_state = execute_choice(state, choice)
        if run(new_state):
            return true
    return false

注意事项:

  1. 典型的解决方案是递归的,因此存在最大深度限制,您可以检查(基于内存)。

  2. 您需要在某个时候停止检查新的“可能选择”。例如,在给定矩阵2x2的任务中,您可以想象在无休止循环中左,右,左,右为0。您需要设置一个硬限制或检测以前被鼓励的状态。

  3. new_state之所以这样命名是有原因的-您需要复制。您需要记住“旧”状态,这样您可以回到原来的状态。您如何将其保存在内存中是另一个故事。