#include<iostream>
#include<iomanip>
#include<vector>
using namespace std;
bool snackMartix(vector<vector<int>> &mat, int n,int m,int & j) {
if (n % 2 == 0)
return false;
if (n == 1) {
mat[j][j] = 1;
return true;
}
else {
int k = 0;
for (int i = m - j - 1; i >= j+1; i--) {
mat[i][j] = n*n - k++;
}
for (int i = j; i < m - j - 1; i++) {
mat[j][i] = n*n - k++;
}
for (int i = j; i < m - j - 1; i++) {
mat[i][m - j - 1] = n*n - k++;
}
for (int i = m - j - 1; i >= j + 1; i--) {
mat[m - j - 1][i] = n*n - k++;
}
j++;
return snackMartix(mat, n-2,m,j);
}
}
int snack2(int n, vector<vector<int>> &a)//用递归的方法
{
int i, j, m;
if (n == 1)return a[0][0] = 1;
else if (n % 2 == 0)//偶数阶的最外面的数是顺时针的方向
{
m = (n - 1)*(n - 1) + 1;
for (i = 0; i<n; i++)
a[i][n - 1] = m++;
for (j = n - 2; j >= 0; j--)
a[n - 1][j] = m++;
return snack2(n - 1, a);
}
else//奇数阶的最外面是逆时针的方向
{
m = (n - 1)*(n - 1) + 1;
for (j = 0; j<n; j++)
a[n - 1][j] = m++;
for (i = n - 2; i >= 0; i--)
a[i][n - 1] = m++;
return snack2(n - 1, a);
}
}
int main() {
int n;
while (cin >> n) {
int j = 0;
vector<vector<int>> mat(n, vector<int>(n));
snackMartix(mat, n, n, j);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << setw(6) << mat[i][j] << " ";
cout << endl;
}
cout << "*************************************" << endl;
vector<vector<int>> mat2(n, vector<int>(n));
snack2(n, mat2);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << setw(6) << mat2[i][j] << " ";
cout << endl;
}
}
return 0;
}
08-09
09-17