8queen

研究室で再帰で組み合わせを出すコードを死ぬほど考えたが全く出来ず終わる頭の悪さだったので、
パターンを自分で考えずに他人に頼ることにした。

def eight_queen(n = 8, m = 8)
  run(n, m, [])
end

def run(kinds, len, a)
  return unless can_set_queen?(a)
  if len == 0 then
    puts a.join(',')
  else
    kinds.times do |i|
      run(kinds,len-1,a+[i])
    end
  end
end

def can_set_queen?(a)
  return false if a.size != a.uniq.size
  a.each_with_index do |v, i|
    a.each_with_index do |vv, ii|
      next if i == ii
      diff = i - ii
      return false if vv == v - diff or vv == v + diff
    end
  end
  return true
end

eight_queen()