实现这个目标,可以把数字想像成一条蛇,蛇爬过的数字就加一。把二维数组[y][x]作为地图,y为纵轴,x为横轴。通过改变蛇的坐标让它爬起来(是不是很像贪吃蛇)。!!
#include <iostream>

using namespace std;

//蛇走地图和坐标
int map[100][100] = { {0} };
int x = 0, y = 0;

//蛇走后的留下的数字
int num = 0;

//蛇的前进方向
void right(int);
void down(int);
void left(int);
void up(int);

int main()
{
    int size;
    cin >> size;
    int step;
    
    if (size % 2 == 1)
    {
        for (step = size - 1; step > 0; step -= 2)
        {
            right(step);
            down(step);
            left(step);
            up(step);
            x++;
            y++;
        }
        int middle = (size - 1) / 2;
        map[middle][middle] = ++num;
    }

    if (size % 2 == 0)
    {
        for (step = size - 1; step > 0; step -= 2)
        {
            right(step);
            down(step);
            left(step);
            up(step);
            x++;
            y++;
        }
    }

    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            cout << map[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

void right(int step)
{
    int i;
    for (i = 0; i < step; i++)
    {
        num++;
        map[y][x++] = num;
    }
}

void left(int step)
{
    int i;
    for (i = 0; i < step; i++)
    {
        num++;
        map[y][x--] = num;
    }
}

void down(int step)
{
    int i;
    for (i = 0; i < step; i++)
    {
        num++;
        map[y++][x] = num;
    }
}

void up(int step)
{
    int i;
    for (i = 0; i < step; i++)
    {
        num++;
        map[y--][x] = num;
    }
}

这些都挺简单的对吧,关键是怎么让蛇在我们希望时调头。在这我想先说说我发现的一些规律:
(9^2-1)/4=20=2+4+6+8;    10^2/4=25=1+3+...+9;

(11^2-1)/4=120=2+4+...+10;    12^2/4=36=1+3+...+11;

对于奇数(a^2-1)/4=2+4+...+(a-1);  对于偶数(b^2)/4=1+3+...+(b-1);

也许你会说这有什么用,别急,好戏还在后头。

我们要围成n*n的正方形矩阵,正方形有4条边,正好对应上面的除以4,所以,你懂我意思把。

以10*10为例,第一层每边走9步,第二层7步,第三层5步,第四层3步,第五层1步,这样就刚好把整个地图走完。

这是不是和10^2/4=25=1+3+...+9很像。
对应如图: