n = ARGV[0].to_i srand ARGV[1].to_i c = (0...(n*n)).to_a f = Array.new(2){Array.new(n*n, 0)} todo = (Array.new(n*(n-1)) {|i| [0,i+i/(n-1)]}+Array.new(n*(n-1)) {|i| [1,i]}).shuffle o = [1,n] ec,tp = n*n-1,0 while ec>0 d,p,tp = *(todo[tp]),tp+1 if c[p]!=c[p+o[d]] f[d][p]=1 a = [c[p],c[p+o[d]]].sort c.map!{|e| e==a[1] ? a[0] : e} ec-=1 end end puts n puts "+---"*n+"+" n.times{|i| puts "| "+f[0][(i*n)...(i*n+n-1)].map{|e| "| "[e]+" "}.join+"|" puts "+" +f[1][(i*n)...(i*n+n)].map{|e| ["---+"," +"][e]}.join if i