找规律,多列几个,注意遇到边界如何处理

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[n+1][n+1];
    memset(a,0,sizeof(a));
    int i=1,j=1,k=1;
    a[i][j]=k;
    k++;
    while(k<=n*n)
    {
        if(i==1&&j!=n)//除了j=n,属于j等于n的情况,其他交叉情况都按i=1处理,
        {
            a[i][++j]=k;//先右移一个
            k++;
            while(i!=n&&j!=1)//左斜下移
            {
                a[++i][--j]=k;
                k++;
            }
        }
        else if(i==n)
        {
            a[i][++j]=k;//右移一个
            k++;
            while(i!=1&&j!=n)//右斜上移
            {
                a[--i][++j]=k;
                k++;
            }
        }
        else if(j==1)
        {
            a[++i][j]=k;//下移一个
            k++;
            while(i!=1&&j!=n)//右斜上移
            {
                a[--i][++j]=k;
                k++;
            }
        }
        else if(j==n)
        {
             a[++i][j]=k;//下移一个
            k++;
            while(i!=n&&j!=1)//左斜下移
            {
                a[++i][--j]=k;
                k++;
            }
        }
    }

    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
}