用一个向量数组保存方向,观察方向规律,向右和向下都仅走一次,同时当坐标到达对角线时,方向运行顺序反向
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int dir[4][2] = {{0, 1}, {1, -1}, {1, 0}, {-1, 1}};
    int dircount = 0;
    int juzhen[n + 1][n + 1];
    fill_n(&juzhen[0][0], (n + 1) * (n + 1), -1);
    int x = 1, y = 1;
    juzhen[x][y] = 1;
    int flag = 0;
    for (int i = 2; i <= n * n; i++)
    {
        int px = x + dir[dircount % 4][0];
        int py = y + dir[dircount % 4][1];
        if((px>n&&py==0)||(px==0&&py>n))
             flag = 1;
        if (px > 0 && px <= n && py > 0 && py <= n)
        {
            if (juzhen[px][py] == -1)
                juzhen[px][py] = i;
            else if(flag)
            {
                dircount--;
                px = x + dir[dircount % 4][0];
                py = y + dir[dircount % 4][1];
                juzhen[px][py] = i;
            }
            else
            {
                dircount++;
                px = x + dir[dircount % 4][0];
                py = y + dir[dircount % 4][1];
                juzhen[px][py] = i;
            }
        }
        else if (flag)
        {
            dircount--;
            px = x + dir[dircount % 4][0];
            py = y + dir[dircount % 4][1];
            juzhen[px][py] = i;
        }
        else
        {
            dircount++;
            px = x + dir[dircount % 4][0];
            py = y + dir[dircount % 4][1];
            juzhen[px][py] = i;
        }
        x = px;
        y = py;
       
        if (dircount % 4 == 0 || dircount % 4 == 2)
            if (flag)
            {
                dircount--;
            }
            else dircount++;
       
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            cout << juzhen[i][j] << " ";
        }
        cout << endl;
    }
}