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.Arrays;
import java.util.Scanner;

//Spiral Pattern
public class Main{

	static char[][] s;
	static int n;
	static int[][] move = {{-1,0},{0,1},{1,0},{0,-1}};
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		boolean f = true;
		while(t--!=0){
			if(!f)System.out.println();
			f = false;
			n = sc.nextInt();
			s = new char[n][n];
			for(int i=0;i<n;i++)Arrays.fill(s[i], ' ');
			int i = n;
			int j = 0;
			int k = 0;
			while(true){
				int ni = i+move[k][0];
				int nj = j+move[k][1];
				if(0<=ni&&ni<n&&0<=nj&&nj<n&&c(ni,nj)){
					s[ni][nj] = '#';
					i = ni;
					j = nj;
				}
				else{
					k = (k+1)%4;
					ni = i+move[k][0];
					nj = j+move[k][1];
					if(0<=ni&&ni<n&&0<=nj&&nj<n&&c(ni,nj)){
						s[ni][nj] = '#';
						i = ni;
						j = nj;
					}
					else break;
				}
			}
			for(int x=0;x<n;x++)System.out.println(new String(s[x]));
		}
	}
	
	static boolean c(int i, int j){
		int c = 0;
		for(int k=0;k<4;k++){
			int ni = i+move[k][0];
			int nj = j+move[k][1];
			if(0<=ni&&ni<n&&0<=nj&&nj<n&&s[ni][nj]=='#')c++;
		}
		return c<=1;
	}
}