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


import java.util.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;

public class Main {

	int INF = 1 << 28;
	int dx[] = {-1,0,1,0};
	int dy[] = {0,-1,0,1};

	void run() {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		for(int c=0;c<n;c++) {
			int d = sc.nextInt();
			boolean map[][] = new boolean[d+4][d+4];
			for(boolean[] a: map) fill(a, true);
			for(int i=1;i<d+3;i++) for(int j=1;j<d+3;j++)
				map[i][j] = false;
			
			int sx = 2;
			int sy = d+1;
			int dir = 1;
			int cnt=0;
			for(;;) {
				map[sy][sx] = true;
				if(map[sy+2*dy[dir]][sx+2*dx[dir]]) {
					dir = (dir+1)%4;
					cnt++;
				}
				if(cnt==d) break;
				sx+=dx[dir];
				sy+=dy[dir];
			}
			for(int i=2;i<d+2;i++) {
				for(int j=2;j<d+2;j++) {
					if(map[i][j]) System.out.print("#");
					else System.out.print(" ");
				}
				System.out.println();
			}
			if(c!=n-1)
				System.out.println();
		}
	}

	public static void main(String[] args) {
		new Main().run();
	}

	void debug(Object... os) {
		System.err.println(Arrays.deepToString(os));
	}
}