Rubyでループが途中で止まってしまう


AtCoderのABC294-Cの問題を解くためのコードを書いたのですが、入力を以下の様にすると、16回行われるはずのループが4回で止まってしまいます。

**入力:**

[code]

    3 3
    1 2 3
    4 5 6
    7 8 9
    
[/code]

**作成したコード:**

[code]

    require 'set'
    h,w=gets.chomp.split(" ").map(&:to_i)
    board=[]
    h.times do |i|
        board[i]=gets.chomp.split(" ").map(&:to_i)
    end
    sets=[]
    2**(h+w-2).times do |i|
    #    printf("%04b\n",i)
        count=0
        (h+w-2).times do |k|
            if i[k]==1
                count+=1
            end
        end
        unless count==h-1
            next
        end
        flag=true
        pos=[0,0]
        s=Set.new
        s.add(board[0][0])
        (h+w-2).times do |j|
            dir=[0,0]
            if i[j]==1
                dir=[1,0]
            else
                dir=[0,1]
            end
            pos[0]+=dir[0]
            pos[1]+=dir[1]
            d=board[pos[0]][pos[1]]
            if s.include?(d)
                flag=false
                break
            else
                s.add(d)
            end
        end
        if flag==true
            sets.push(s)
        end
    end
    puts sets.size
    
[/code]




最初のループの始まりを次のようにしてください。これでうまくいくはずです。

[code]

    (2**(h+w-2)).times do |i|
    
[/code]

解説

`**`は[かなり高い優先順位の演算子](https://docs.ruby-
lang.org/ja/latest/doc/spec=2foperator.html)ですが、オブジェクトのメソッド呼び出しの`.`の方が(ドキュメントには明記されていませんが)高いです。そのため、`2**(h+w-2).times
do |i| ... end`は`2**((h+w-2).times do |i| ...
end)`と解釈されます。つまり、ループは`h+w-2`しかおきず、その後(無意味に)2の累乗していることになります。

