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 C# (judge verdict: Accepted)

using System;

namespace AOJ.Volume1
{
    public class SpiralPattern
    {
        public static int Main()
        {
            int dataset = int.Parse(Console.ReadLine());
            for (int d = 0; d < dataset; d++)
            {
                int n = int.Parse(Console.ReadLine());
                var sq = new string[n];
                // 初期化
                string line = new string('#', n);
                int cnt = n % 2 == 0 ? n / 2 : n / 2 + 1;
                
                // 上半分
                string bef = "";
                string aft = "";
                bool horizontal = true;
                for (int i = 0; i < cnt; i++)
                {
                    if (horizontal) { line = bef + new string('#', n - bef.Length - aft.Length) + aft; }
                    else
                    {
                        if (bef.Length + aft.Length > n) { line = bef + aft.Substring(1); }
                        else
                        {
                            line = bef + new string(' ', n - bef.Length - aft.Length) + aft;
                        }
                    }
                    sq[i] = line;
                    if (i % 2 == 0)
                    {
                        bef += "# ";
                        aft += " #";
                    }
                    horizontal = !horizontal;
                }

                // 下半分
                cnt = n / 2;
                bef = "# ";
                aft = "";
                horizontal = true;
                for (int i = 1; i <= cnt; i++)
                {
                    if (horizontal) { line = bef + new string('#', n - bef.Length - aft.Length) + aft; }
                    else
                    {
                        if (bef.Length + aft.Length > n)
                        {
                            line = bef + aft.Substring(1);
                        }
                        else
                        {
                            line = bef + new string(' ', n - bef.Length - aft.Length) + aft;
                        }
                    }
                    sq[n - i] = line;
                    if (i % 2 != 0)
                    {
                        if (n % 4 == 0 && i == cnt - 1) { aft += " #"; }
                        else
                        {
                            bef += "# ";
                            aft += " #";
                        }
                    }
                    horizontal = !horizontal;
                }

                for (int i = 0; i < n; i++)
                {
                    Console.WriteLine(sq[i]);
                }
                if (d != dataset - 1) { Console.WriteLine(); }
            }
            return 0;
        }
    }
}