N = gets.to_i M = 31 S = N.times.map{ gets[0,N] } mask = 0 last_mask = 0 S.each_with_index{|s, y| s.chars.each_with_index{|c, x| next if y >= x n = y * N + x last_mask |= 1 << 1 * n next if c == ?- # 試合済み mask |= 1 << 1 * n # 勝利 mask |= 1 << 1 * n + M if c == ?o } } f = ->mask{ if (mask & (1 << M) - 1) == last_mask table = [0] * N N.times{|y| N.times{|x| next if y >= x r = mask & (1 << y * N + x + M) > 0 table[y] += 1 if r table[x] += 1 if !r } } table.uniq.sort_by{|v|-v}.index(table[0]) + 1 else N.times{|y| N.times{|x| next if y >= x n = y * N + x # 試合済み next if mask & (1 << n) > 0 lose_mask = mask | (1 << n) win_mask = lose_mask | (1 << n + M) return [f[lose_mask], f[win_mask]].min } } end } p f[mask]