27
代码:
include <stdlib.h>
int max(int a, int b)
{
return a > b ? a : b;
}
// 返回较小值
int min(int a, int b)
{
return a < b ? a : b;
}
int main()
{
int n;
scanf("%d", &n);
int **matrix = (int **)malloc(n * sizeof(int *));
for (int i = 0; i < n; ++i)
matrix[i] = (int *)malloc(n * sizeof(int));
int count = 0; // 之前填的
// 所有的对角线和s(i+j)
for (int s = 0; s <= 2 * n - 2; ++s)
{
int a = max(0, s - (n - 1)); // i的最小值
int b = min(s, n - 1);
if (s % 2 == 0)
{ // s为偶数,i从b到a(降序)
for (int i = b; i >= a; --i)
{
int j = s - i;
matrix[i][j] = ++count;
}
}
else
{ // s为奇,升序
for (int i = a; i <= b; ++i)
{
int j = s - i;
matrix[i][j] = ++count;
}
}
}
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
printf("%d", matrix[i][j]);
if (j != n - 1)
{ // 避免最后一个元素后输出空格
printf(" ");
}
}
printf("\n");
}
for (int i = 0; i < n; ++i)
free(matrix[i]);
free(matrix);
return 0;
}
bug:
收获:蛇形关键:对角线 + 交替方向。对角线由 i+j=k 定义,覆盖所有元素。偶数对角线从下往上填,奇数对角线从上往下填,形成“蛇形转弯”
浙公网安备 33010602011771号