难点:在于边界值的限制,通过边界x,y坐标的表示与整体矩阵边界的比较,蛇形斜边的走向,向左为走一步

方法:右移,下移,对角线奇偶判断蛇形走向

向右走一步

if((x==0||x==n-1)&&y<n-1)
a[x][++y]=count++;
// 在第一行与最后一行进行右移,边界值在于最后一列y轴的边界

向下走一步

else if((y==0||y==n-1)&&x<n-1)
a[++x][y]=count++;
//在第一列与最后一列进行下移,边界值在于最后一行x轴的边界

从右上到左下

if(ans %2 ==0)
while(y>0&&x<n-1)
a[++x][--y]=count++;
//通过ans为偶数表示斜向下走向,边界值在于最后一行与第一列

从左下到右上

if(ans %2 == 1&&y<n-1)
while(x>0&&y<n-1)
a[--x][++y]=count++;
//通过ans为奇数表示斜向上走向,边界值在于第一行与最后一列
#include<bits/stdc++.h>
using namespace std;

const int N=1010;
int a[N][N];
int x,y,n;
int main()
{
    int count = 2;
    cin>>n;
    int ans=1;
    int level=2*n-1;
    a[0][0]=1;
    while(ans<=level)
    {
        ans++;
//         横向
        if((x==0||x==n-1)&&y<n-1)
            a[x][++y]=count++;
//             纵向
        else if((y==0||y==n-1)&&x<n-1)
            a[++x][y]=count++;
        
        //右上--左下
        if(ans %2 ==0)
            while(y>0&&x<n-1)
                a[++x][--y]=count++;
            
        //左下--右上
        if(ans %2 == 1&&y<n-1)
            while(x>0&&y<n-1)
                a[--x][++y]=count++;
            
        
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            cout<<a[i][j]<<" ";
        cout<<"\n";
    }
    return 0;
}