我正在尝试验证一个8个位置的向量。这个位置是NxM矩阵的运动,其中N =列,M =行。
运动是:
主要目标是孔移动解决方案不会超出矩阵的范围。
这是我的代码:
迭代直到找到有效的解决方案。
while ! valid
start_solution = generate_random_solution
valid = validate_solution(start_solution)
end
使用移动数生成随机向量没有任何问题。这是generate_random_solution的功能。
def validate_solution(solution)
position = @start.dup
move_count = 0
solution.each do |movement|
next_position = move(movement, position)
unless next_position.nil?
position = next_position
move_count += 1
end
end
move_count == @num_moves ? true : false
end
@start在这种情况下是(0,0)3x3矩阵的第一个位置。 @num_moves是N * N - 1.我可以在矩阵中进行的移动次数。
这是返回新位置的函数,如果移动无效,则默认值为nil。
def move(mov, pos)
case mov
when 0 # NORTH
return Position.new(pos.x, pos.y - 1) if pos.y > 0
when 1 # SOUTH
return Position.new(pos.x, pos.y + 1) if pos.y < @m
when 2 # EAST
return Position.new(pos.x + 1, pos.y) if pos.x < @n
when 3 # WEST
return Position.new(pos.x - 1, pos.y) if pos.x > 0
end
end
这是我的问题。似乎在某些时候,移动函数不返回nil并允许向量超出边界。
感谢您的帮助。