题目描述:输入正整数n,输出n阶方阵,将1~n²按斜线方向S形顺序填入,例如n=5时,输出:
1 3 4 10 11
2 5 9 12 19
6 8 13 18 20
7 14 17 21 24
15 16 22 23 25
这是一个n*n的二维数组,斜向的线段共有2n-1条,我们可以按1~2n-1号斜线的顺序进行填入,奇数号与偶数号的填写顺序也是不一样的。同时,对于方阵的上三角部分和下三角部分,奇偶斜线的填入起点也是不一样的,如上三角奇数斜线从第0行填起,下三角奇数斜线从第n-1列填起。
完整代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n,i,j,k,d; //n为阶数,k为填入的数,d为斜线编号
scanf("%d", &n);
int a[100][100];
for (k = d = 1; d <= 2 * n - 1; d++)
{
if (d <= n) //对于上三角部分
{
if (d % 2 == 1) //奇数号
{
for (i = 0, j = d-1; i <= d-1; i++, j--)//从右上往左下填入
a[i][j] = k++;
}
else //偶数号
{
for (i = d-1, j = 0; j <= d-1; i--, j++)//从左下往右上
a[i][j] = k++;
}
}
else //对于下三角部分
{
if (d % 2 == 0) //偶数号
{
for (i = n - 1, j = d - n; j <= n - 1; i--, j++)
a[i][j] = k++;
}
else //奇数号
{
for (i = d - n, j = n - 1; i <= n - 1; i++, j--)
a[i][j] = k++;
}
}
}
for (i = 0; i <= n - 1; i++)
for (j = 0; j <= n - 1; j++)
{
printf("%d ", a[i][j]);
if (j == n - 1)
printf("\n");
}
return 0;
}
输入 7
输出:
1 3 4 10 11 21 22
2 5 9 12 20 23 34
6 8 13 19 24 33 35
7 14 18 25 32 36 43
15 17 26 31 37 42 44
16 27 30 38 41 45 48
28 29 39 40 46 47 49