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 static java.util.Arrays.deepToString;

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		new Main().run();
	}
	void tr(Object... os) {
		System.err.println(deepToString(os));
	}

	Scanner sc = new Scanner(System.in);
	public void run() {
		int t = sc.nextInt();
		for (int i = 0; i < t; i++) {
			if (i > 0) System.out.println();
			solve(sc.nextInt());
		}
	}
	
	void solve(int n) {
		char[][] t = new char[n][n];
		for (int i = 0; i < n; i++) Arrays.fill(t[i], ' ');
		
		int[] dr = {-1, 0, 1, 0};
		int[] dc = {0, 1, 0, -1};
		
		int r = n - 1;
		int c = 0;
		
		t[r][c] = '#';
		int d = 0;
		int miss = 0;
		for (; miss < 4;) {
			int nr = r + dr[d];
			int nc = c + dc[d];
			int nnr = r + 2 * dr[d];
			int nnc = c + 2 * dc[d];
			if (isin(nr, nc, n) &&
				t[nr][nc] != '#' && 
				(!isin(nnr, nnc, n) || t[nnr][nnc] != '#') &&
				t[nr + dr[(d+1)&3]][nc+dc[(d+1)&3]] != '#' ) {
				r = nr;
				c = nc;
				t[r][c] = '#';
				miss = 0;
			} else {
				d = (d + 1) & 3;
				miss++;
			}
		}
		for (int i = 0; i < n; i++) {
			System.out.println(new String(t[i]));
		}
		
	}
	boolean isin(int r, int c, int n) {
		return 0 <= r && r < n && 0 <= c && c < n;
	}
}