//问题描述
/*
输入一个整数n,输出n阶方阵,也即n*n的矩阵
如:n=4,输出如下
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
可以看成是数列一层一层往里增加
最外面一层可以分为四段
1 2 3 ........A
4 5 6 ........B
7 8 9 ........C
10 11 12 ........D
同理,里面一层分为四段
13
14
15
16
很容易想到,如果n为奇数,则最里面一层只有一个数,因此,如果n为奇数,则上面分层输出值进行到
里面倒数第二层,最后一层单独输出
在一层一层往里走的同时,行、列、边界均有发生变化
依次输出A、B、C、D
*/
#include <iostream>
using namespace std;
int main()
{
int N;
while (cin >> N)
{
int ** data = new int*[N];
for (int i = 0; i < N; i++)
{
data[i] = new int[N];
memset(data[i], 0, N * 4);
}
int num = 1;
int start = 0;
int end = N-1; //第i层每一段输出N-i个
for (int layer = 0; layer <= N / 2; layer++)
{
//输出A段
for (int j = start; j < end; j++)
data[start][j] = num++;
//输出B段
for (int j = start; j < end; j++)
data[j][end] = num++;
//输出C段
for (int j = end; j > start; j--)
data[end][j] = num++;
//输出D段
for (int j = end; j > start; j--)
data[j][start] = num++;
start++;
end--;
}
//如果n为奇数,则输出最里面一个
if (N % 2 == 1)
{
data[start-1][start-1] = num;
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cout << data[i][j] << " ";
}
cout << endl;
}
<span style="white-space:pre"> </span>//释放内存
<span style="white-space:pre"> </span>for (int i = 0; i < N; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>delete data[i];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>delete data;
}
return 0;
}