0

8 ポジションの 1 つのベクトルを検証しようとしています。この位置は、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