我正在尝试验证一个包含 8 个位置的向量。该位置是 NxM 矩阵中的移动,其中 N = 列,M = 行。
运动是:
- 北 -> 0
- 南 -> 1
- 东 -> 2
- 西 -> 3
主要目标是孔移动解决方案不会超出矩阵的范围。
这是我的代码:
迭代直到找到有效的解决方案。
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 并允许向量超出范围。
谢谢您的帮助。