# @param {Integer[][]} grid # @return {Node} def construct(grid) if grid.size==1 return Node.new([false,true][grid[0][0]],true) else n=grid.size/2 lu=construct(grid[...n].map{|v|v[...n]}) ru=construct(grid[...n].map{|v|v[n...]}) ld=construct(grid[n...].map{|v|v[...n]}) rd=construct(grid[n...].map{|v|v[n...]}) if lu.isLeaf&&ru.isLeaf&&ld.isLeaf&&rd.isLeaf&&[lu.val,ru.val,ld.val,rd.val].uniq.size==1 return Node.new(lu.val,true) else return Node.new(false,false,lu,ru,ld,rd) end end end