def f(r, c) label, z = 0, (1..r).map {|i| (i...i + c).to_a} z.flatten.uniq.each_with_object((1..r).map{[]}) do |k, a| (0...r).method([:each, :reverse_each][k % 2]).call do |i| (0...c).each {|j| a[i][j] = (label += 1) if z[i][j] == k} end end end p [[3, 3], [4, 2], [3, 5], [1, 8]].map{|r, c| [r, c, f(r, c)]}
Standard input is empty
[[3, 3, [[1, 2, 6], [3, 5, 7], [4, 8, 9]]], [4, 2, [[1, 2], [3, 5], [4, 6], [7, 8]]], [3, 5, [[1, 2, 6, 7, 12], [3, 5, 8, 11, 13], [4, 9, 10, 14, 15]]], [1, 8, [[1, 2, 3, 4, 5, 6, 7, 8]]]]