再びN-queens問題(エイトクイーンズ問題)
勘違い
id:ujihisa兄さんのレスにしたがって書いてみましたが動きません。どしてかなぁ
なんだかどえらい間違いをしている気がします。あほの子
class Queens 中略 def calc(i=0) @answer = 0 calc(0) end def calc(i) if i == @boardSize # print(" show_ans;[") # @boardSize.times{|k| printf("%s,",@matrix[k])} # print("]\n") @answer +=1 else @boardSize.times{|k| if check(i,k) @matrix[i] = k calc(i+1) end } end end 中略 end 後略
ああ!関数のデフォルト値!
やっぱりあほの子だったらしい私。id:faultierにいさんからツッコミがはいりました。
ujihisa兄さんが言ってるのは、(このコードで言うと二個目の方の)calcの引数をi=0にしておいて、
最初にiが0だったときの処理を書いておくと、引数が無かったときにiの値を0にして処理を実行してくれるという話。
あーなるほどー。ではこうすればよいんですね。
class Queens def initialize(n) @answer = 0 @boardSize = n; @matrix = Array.new(@boardSize) end def get_answer @answer end def check(i,j) i.times{|k| if j==@matrix[k]||(i+j)==(k+@matrix[k])||(i-j)==(k-@matrix[k]) return false end } return true end def calc(i=0) if i == @boardSize # print(" show_ans;[") # @boardSize.times{|k| printf("%s,",@matrix[k])} # print("]\n") @answer +=1 else @boardSize.times{|k| if check(i,k) @matrix[i] = k calc(i+1) end } end end end n = ARGV[0].to_i newGame = Queens.new(n) newGame.calc p newGame.get_answer
オーバーロードは関数のデフォルト値を使うことで擬似的に実装できることもありそうですね。
引数に行列を持ってこれるようなので実際にはあまり問題にならないことなのかもしれません。
やっぱりあほの子ですみませんでした。勉強になりました。