我在尝试在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() `
答案 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
注意事项:
典型的解决方案是递归的,因此存在最大深度限制,您可以检查(基于内存)。
您需要在某个时候停止检查新的“可能选择”。例如,在给定矩阵2x2的任务中,您可以想象在无休止循环中左,右,左,右为0。您需要设置一个硬限制或检测以前被鼓励的状态。
new_state
之所以这样命名是有原因的-您需要复制。您需要记住“旧”状态,这样您可以回到原来的状态。您如何将其保存在内存中是另一个故事。