首先分为2n-1次循环。每次循环会写入整个斜边的数字。斜边的方向有左下,右上。当循环次数k<=n时,当k为单数时,方向为右上,当k为双数时,方向为左下。当循环次数n<k<2*n-1时,当k为单数时,方向为右上,当k为双数时,方向为左下。
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n][n];
int i,k,j;
int x=1;
for(k=1;k<=2*n-1;k++) //总共有7个斜边
{
if(k<=n) //前4个斜边
{
if(k%2==0) //如果斜边是双数次
{
for(i=0,j=k-1;j>=0;i++,j--) //初始位置是a[0][k-1],由于是向左下移动,j碰壁的时候循环结束
a[i][j]=x++;
}
else //如果斜边是单数次
{
for(i=k-1,j=0;i>=0;j++,i--) //初始位置是a[k-1][0],由于是向右上移动,i碰壁的时候循环结束
a[i][j]=x++;
}
}
else //后三个斜边
{
if(k%2==0)
{
for(i=k-n,j=n-1;i<n;j--,i++) //初试位置a[k-n][n-1],由于向左下移动,i碰壁的时候停止循环
a[i][j]=x++;
}
else
{ for(i=n-1,j=k-n;j<n;i--,j++) //初始位置a[n-1][k-n],由于向右上移动,j碰壁的时候停止循环
a[i][j]=x++;}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}


京公网安备 11010502036488号