Problem:
ぐるぐる模様

「ぐるぐる模様」を表示するプログラムを作成することにしました。「ぐるぐる模様」は以下のようなものとします。

1 辺の長さが n の場合、n 行 n 列の文字列として表示する。

左下隅を基点とし，時計回りに回転する渦状の模様とする。

線のある部分は #（半角シャープ）、空白部分は " "（半角空白）で表現する。

線と線の間は空白を置く。

整数 n を入力とし，1 辺の長さが n の「ぐるぐる模様」を出力するプログラムを作成してください。

Input

入力は以下の形式で与えられます。

d
n1
n2
:
nd

１行目にデータセットの数 d (d ≤ 20)、続く d 行に i 個目のぐるぐる模様の辺の長さ ni (1 ≤ ni ≤ 100) がそれぞれ１行に与えられます。

Output

データセットごとに、ぐるぐる模様を出力してください。データセットの間に１行の空行を入れてください。

Sample Input

2
5
6

Output for the Sample Input

#####
# #
# # #
# # #
# ###

######
# #
# ## #
# # #
# # #
# ####

Solution in Ruby (judge verdict: Accepted)



DIRS = [[0, -1], [1, 0], [0, 1], [-1, 0]]

def inside(n, x, y)
  (x >= 0 && x < n && y >= 0 && y < n)
end

def no_barrier(n, flds, x, y)
  (! inside(n, x, y) || flds[y][x] != '#')
end

d = gets.strip.to_i

need_blank = false

d.times.each do |di|
  n = gets.strip.to_i

  flds = n.times.map{" " * n}

  x = 0
  y = n - 1
  flds[y][x] = '#'
  dir = 0
  fwd = 0
  turn = 0

  while true
    dx, dy = DIRS[dir]
    x0 = x + dx
    y0 = y + dy
    x1 = x0 + dx
    y1 = y0 + dy

    if inside(n, x0, y0) && no_barrier(n, flds, x1, y1)
      x = x0
      y = y0
      flds[y][x] = '#'
      fwd += 1
    elsif fwd < 2 && turn > 0
      break
    else
      dir = (dir + 1) % 4
      fwd = 0
      turn += 1
    end
  end

  puts if need_blank
  need_blank = true

  flds.each{|hl| puts hl}
end