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)

//Volume1-0141
import java.util.Scanner;

public class Main {

	private static int x,y,dr,n;
	private static final int     X   = 0,
			                     Y   = 1;
	private static final int[][] dir = {{0,-1},{1,0},{0,1},{-1,0}};
	private static char[][] ptn;

	public static void main(String[] args){

		//declare
		int d;

		//input
        Scanner sc = new Scanner(System.in);
        d = sc.nextInt();
        while(d-- > 0){
        	n   = sc.nextInt();
        	ptn = new char[n][n];
        	init();
        	while(true){
        		if(search()){
        			Go();
        		} else {
        			break;
        		}
        	}
        	print();
        	if(d > 0){System.out.println();}
        }
	}

	private static void print(){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				System.out.print(ptn[i][j]);
			}
			System.out.println();
		}
	}

	private static void Go(){
		x += dir[dr][X];
		y += dir[dr][Y];
		ptn[y][x] = '#';
	}

	private static void init(){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				ptn[i][j] = ' ';
			}
		}
    	x   = 0;
    	y   = n;
    	dr  = 0;
	}

	private static boolean search(){
		boolean ret = false;
		for(int i=0;i<2;i++){
			if(chk(x,y,dr)){ret = true;break;}
			turn();
		}
		return ret;
	}

	private static boolean chk(int x,int y,int r){
		boolean ret = false;
		int r_x,r_y;
		int s_x = x+dir[r][X];
		int s_y = y+dir[r][Y];
		if(s_x < 0 || s_x >= n || s_y < 0 || s_y >= n || ptn[s_y][s_x] == '#'){
			return ret;
		}
		r=trn(r,-1);
		ret = true;
		for(int i=0;i<3;i++){
			r_x = s_x+dir[r][X];
			r_y = s_y+dir[r][Y];
			if(0 <= r_x && r_x < n && 0 <= r_y && r_y < n && ptn[r_y][r_x] == '#'){
				ret = false;
				break;
			}
			r = trn(r);
		}
		return ret;
	}

	private static int trn(int r){
		return ++r%4;
	}
	private static int trn(int r,int i){
		return (r+i+4)%4;
	}

	private static void turn(){
		dr = ++dr%4;
	}
}