読者です 読者をやめる 読者になる 読者になる

毛のはえたようなもの

インターネット的なものをつらつらとかきつらねる。

再び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

オーバーロードは関数のデフォルト値を使うことで擬似的に実装できることもありそうですね。
引数に行列を持ってこれるようなので実際にはあまり問題にならないことなのかもしれません。
やっぱりあほの子ですみませんでした。勉強になりました。