难点:在于边界值的限制,通过边界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;
}