http://ja.wikipedia.org/wiki/エイト・クイーン すげー悩んだけどわりと綺麗にできた。 再帰+lambda渡しは再帰を巻き戻さないで良いので書きやすい。 変な書き方しないようにしたけど20行きった。 #!/usr/bin/env ruby def put(size=8, queens=[], &block) block.call(queens) if block and queens.size >= size (queens.empty? ? 1 : queens.last[:x]).upto(size).each do |x| 1.upto(size).each do |y| q = {:x => x, :y => y} next if queens.map{|i| q[:x] == i[:x] or q[:y] == i[:y] or q[:x]+q[:y]