Python 2, 179(削除) 179 (削除ここまで) 178 bytes
thanks to Kevin Cruijssen for -1 byte.
n=input()
S,H=' #'
m=[S*n]*(n+1+n%2n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)
Python 2 , 179 bytes
In this approach formulas are used for x and y deltas instead of a lookup list.
n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)
Python 2, 179 bytes
n=input()
S,H=' #'
m=[S*n]*(n+1+n%2)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)
Python 2, (削除) 179 (削除ここまで) 178 bytes
thanks to Kevin Cruijssen for -1 byte.
n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)
Python 2 , 179 bytes
In this approach formulas are used for x and y deltas instead of a lookup list.
n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)
Python 2, 180179 bytes
n=input()
S,H=' #'
m=[S*n]*(n+1+n%2)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec"x+=M[~k];y+=M[k];m[y]=m[y][exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];"*(k-k%2);k+=1;'*n];";k+=1;'*n
print'\n'.join(m)
Python 2, 180 bytes
n=input()
S,H=' #'
m=[S*n]*(n+1+n%2)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];"*(k-k%2);k+=1;'*n
print'\n'.join(m)
Python 2, 179 bytes
n=input()
S,H=' #'
m=[S*n]*(n+1+n%2)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)
Python 2, 185180 bytes
n=input()
S,H=' #'
m=[S*n]*(n+1+n%2)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]0]*n
exec'w=k%4;exec"x+=M[~w];y+=M[w];c=m[y];m[y]=c[exec'exec"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+c[x+1x]+H+m[y][x+1:];"*(k-k%2);k+=1;'*n
print'\n'.join(m)
Python 2, 185 bytes
n=input()
S,H=' #'
m=[S*n]*(n+1+n%2)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]
exec'w=k%4;exec"x+=M[~w];y+=M[w];c=m[y];m[y]=c[:x]+H+c[x+1:];"*(k-k%2);k+=1;'*n
print'\n'.join(m)
Python 2, 180 bytes
n=input()
S,H=' #'
m=[S*n]*(n+1+n%2)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];"*(k-k%2);k+=1;'*n
print'\n'.join(m)