Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"fmt"
	)

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	out := make([][]string, 100)
	for i := range out {
		out[i] = make([]string, 101)
	}
	dx := []int{0, 1, 0, -1}
	dy := []int{-1, 0, 1, 0}
	scanner.Scan()
	a, _ := strconv.Atoi(scanner.Text())
	for a > 0 {
		a--
		scanner.Scan()
		b, _ := strconv.Atoi(scanner.Text())
		for i := 0; i < b; i++ {
			for j := 0; j < b; j++ {
				out[i][j] = " "
			}
			out[i][b] = "0"
		}
		if b == 1 {
			fmt.Println("#")
			if a != 0 {
				fmt.Println()
			}
			continue
		}
		if b == 2 {
			fmt.Printf("##\n# \n")
			if a != 0 {
				fmt.Println()
				continue
			}
		}
		row := b -1
		col := 0
		dir := 0
		l := 0
		out[row][col] = "#"
		for {
			nrow := row+dy[dir%4]
			ncol := col+dx[dir%4]
			if dir%4 == 0 && nrow == 0 || dir%4==3&&ncol==0 || dir%4==2&&nrow==b-1 || dir%4==1&&ncol==b-1 {
				row=nrow
				col=ncol
				out[row][col]="#"
				dir++
				l = 1
			} else if out[nrow+dy[dir%4]][ncol+dx[dir%4]]=="#" {
				if l < 3 {
					break
				}
				dir++
				l = 1
			} else {
				row=nrow
				col=ncol
				out[row][col]="#"
				l++
			}
		}
		for i := 0; i < b; i++ {
			for j := 0; j < b; j++ {
				fmt.Printf("%s", out[i][j])
			}
			fmt.Println()
		}
		if a != 0 {
			fmt.Println()
		}
	}
}

C++: #include<iostream>
using namespace std ;

int N ;
int dx[] = {0,1,0,-1} ;
int dy[] = {-1,0,1,0} ;

void func(){
	char table[110][110] ;
	
	for( int i=0 ; i<102 ; i++ ){
		for( int j=0 ; j<102 ; j++ ){
			if( i>=100-N+1 && i<=100 && j>=1 && j<=N ) table[i][j] = '#' ;
			else table[i][j] = ' ' ;
		}
	}
	
	int x = 1   ;
	int y = 100 ;
	int k = 0 ;
	bool f = true ;
	
	while(1){
		if( table[y+dy[k%4]][x+dx[k%4]] == ' ' ) break ;
		bool b = false ;
		while( table[y+dy[k%4]][x+dx[k%4]] != ' ' ){
			if( f || b ) table[y+dy[(k+1)%4]][x+dx[(k+1)%4]] = ' ' ;
			if( !b ) b = true  ;
			if(  f ) f = false ;
			x += dx[k%4] ;
			y += dy[k%4] ;
		}
		k++ ;
	}
	
	for( int i=100-N ; i<=100 ; i++ ){
		for( int j=1 ; j<=N ; j++ ){
			cout << table[i][j] ;
		}cout << endl ;
	}
}

int main(){
	
	int d ;
	
	cin >> d ;
	while( d-- ){
		cin >> N ;
		func() ;
		cout << endl ;
	}
	
return 0;
}

C++: #include <cstdio>
#include <cstring>

int d,n;
int fie[101][101];
int xmax[101];
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};

int max(int a,int b){
	if(a>b)return a;
	return b;
}

int main(void){
	scanf("%d",&d);
	for(int data=0;data<d;data++){
		scanf("%d",&n);
		memset(fie,0,sizeof(fie));
		memset(xmax,0,sizeof(xmax));
		for(int i=0;i<n;i++){
			fie[0][i]=1;
		}
		int len=0,mlen=n-1,x=0,y=0,dir=1,cnt=0;
		while(mlen>0){
			x+=dx[dir];
			y+=dy[dir];
			xmax[y]=max(xmax[y],x);
			fie[x][y]=1;
			len++;
			if(len==mlen){
				cnt++;
				if(mlen==1)break;
				dir=(dir+1)%4;
				len=0;
			}
			if(cnt==2){
				mlen-=2;
				cnt=0;
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<=xmax[i];j++){
				printf("%c",fie[j][i]==1?'#':' ');
			}
			printf("\n");
		}
	}
	return 0;
}

C++: #include <iostream>
using namespace std;

bool field[100][100];

void migi(int y,int x,int j)
{
	for(int i=1;i<=j;i++){
		field[y][x+i] = 1;
	}
}
void sita(int y,int x,int j)
{
	if(j <= 1)
		return;
	for(int i=1;i<=j;i++){
		field[y+i][x] = 1;
	}
}
void hidari(int y,int x,int j)
{
	for(int i=1;i<=j;i++){
		field[y][x-i] = 1;
	}
}
void ue(int y,int x,int j)
{
	if(j <= 1)
		return;
	for(int i=1;i<=j;i++){
		field[y-i][x] = 1;
	}
}	
int main()
{
	int a;
	cin >> a;
	for(int i=0;i<a;i++){
		int n;
		cin >> n;
		for(int j=0;j<n;j++){
			for(int k=0;k<n;k++){
				field[j][k] = 0;
			}
		}
		int y=n-1,x=0;
		for(int j=0;j<n;j++){
			field[y-j][x] = 1;
		}
		y = 0;
		
		for(int j=n-1;j>=0;j-=2){
			migi(y,x,j);
			x = x+j;
			sita(y,x,j);
			y = y+j;			
			j-=2;
			hidari(y,x,j);
			x = x-j;
			ue(y,x,j);
			y = y-j;
		}
		
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(field[i][j] == 1)
					cout << '#';
				else
					cout << ' ';
			}
			cout << endl;
		}
		if(i !=a-1)
			cout << endl;
	}
	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
int main(){

  int d;
  cin>>d;
  for(int cnt=0;cnt<d;cnt++){
    int n,m,ld=0,a[200][200]={};

    if(cnt) cout<<endl;

    cin>>n;
    m=n;

    for(;n>0;){

      for(int i=ld;i<n+ld;i++){
	a[ld][i]=1;
	a[ld+n-1][i]=1;
	a[i][ld]=1;
	a[i][ld+n-1]=1;
      }

      a[ld][ld+1]=0;
      if(n>4) a[ld+1][ld+2]=1;
      n-=4;
      ld+=2;

    }

    for(int i=m-1;i!=-1;i--){
      for(int j=0;j<m;j++) cout<<(a[i][j]?"#":" ");
      cout<<endl;
    }
  }
  return 0;

}

C++: #include <cstdio>
#include <cstring>

int d,n;
int fie[101][101];
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};

int main(void){
	scanf("%d",&d);
	for(int data=0;data<d;data++){
		scanf("%d",&n);
		memset(fie,0,sizeof(fie));
		for(int i=0;i<n;i++){
			fie[0][i]=1;
		}
		int len=0,mlen=n-1,x=0,y=0,dir=1,cnt=0;
		while(mlen>0){
			x+=dx[dir];
			y+=dy[dir];
			fie[x][y]=1;
			len++;
			if(len==mlen){
				cnt++;
				if(mlen==1)break;
				dir=(dir+1)%4;
				len=0;
			}
			if(cnt==2){
				mlen-=2;
				cnt=0;
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				printf("%c",fie[j][i]==1?'#':' ');
			}
			printf("\n");
		}
	}
	return 0;
}

C++: #include "bits/stdc++.h"
using namespace std;
#define rep(i,n) for(int i=0;i<(int)(n);i++)

enum{UP,RIGHT,DOWN,LEFT};
int dy[]={-1,0,1,0};
int dx[]={0,1,0,-1};
int n;

bool adja(bool data[100][100],int y,int x,int dir){
	int left=(dir+3)%4,right=(dir+1)%4;
	if(  x+dx[left ]>=0 && y+dy[left ]>=0 && x+dx[left ]<n && y+dy[left ]<n && data[y+dy[left ]][x+dx[left ]]==true )return true;
	if(  x+dx[right]>=0 && y+dy[right]>=0 && x+dx[right]<n && y+dy[right]<n && data[y+dy[right]][x+dx[right]]==true )return true;
	return false;
}

int main(){
	int a;
	cin>>a;
	bool f=false;
	rep(i,a){
		if(f)cout<<endl;
		f=true;
		bool data[100][100]={};
		cin>>n;
		
		int dir = UP;
		int y=n-1,x=0;
		
		int change_d_times = 0;
		while(1){
			data[y][x]=true;
			int ddx = x+dx[dir], ddy = y+dy[dir];
			if( ddx>=0 && ddy>=0 && ddx<n && ddy<n && !data[ddy][ddx] && !(ddx+dx[dir]>=0 && ddy+dy[dir]>=0 && ddx+dx[dir]<n && ddy+dy[dir]<n && data[ddy+dy[dir]][ddx+dx[dir]]==true) && !adja(data,ddy,ddx,dir) ){
				data[ddy][ddx]=true;
				change_d_times=0;
				x = ddx , y = ddy;
			}
			else{
				dir = (dir+1)%4;
				change_d_times++;
			}
			if(change_d_times>=5)break;
		}
		rep(i,n){
			rep(j,n){
				if(data[i][j])cout<<"#";
				else cout<<" ";
			}
			cout<<endl;
		}
	}
}