0

我正在尝试验证一个包含 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 并允许向量超出范围。

http://pastebin.com/CchpyXwz

谢谢您的帮助。

4

0 回答 0