#include<bits/stdc++.h>
#define N 25
using namespace std;
int main()
{
int T;
cin>>T;
while(T--){
int n;
cin>>n;
int a[N][N];
int num=1;
int x=0,y=n-1;//初始化坐标
memset(a,0,sizeof(a));//给数组初始化0,用来判断某个位置是否填数
a[0][n-1]=1;//第一个位置先放好
//用下面的算法来防止x和y坐标超出二维数组范围!这个是比较麻烦的...
while(num<n*n){//是用的++num
//向下
while(x<n-1 && !a[x+1][y]) a[++x][y]=++num;
//向左
while(y>=1 && !a[x][y-1]) a[x][--y]=++num;
//向上
while(x>=1 &&!a[x-1][y]) a[--x][y]=++num;
//向右
while(y<n-1 && !a[x][y+1]) a[x][++y] =++num;
}
//输出
for(x=0;x<n;x++){
for(y=0;y<n;y++){
cout<<setw(4)<<a[x][y];//#include <iomanip>中的setw()设置域宽
}
cout<<endl;
}
}
return 0;
}
输出示例:
1
5
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5