这道题我真的也弄了很久。
算法分析:
首先我们把它分成上三角和下三角。我们可以把上三角赋值想这样子1, 2 3, 4 5 6, 7 8 9 10, 11 12 13 14 15.
第1次赋值是1次,第2次是2次,第3次是3次...。所以外循环是n次,内循环次数等于该次输出数字的最大行数。然后我们看奇数行和数行的行走的方向是不一样的。奇数行是右再斜下。偶数行是下然后斜上。是这样子赋值的,a[0][0],a[1][0] a[0][1],a[2][0] a[1][1] a[0][2],a[0][3] a[1][2] a[2][1] a[3][0]。可以看到如果是奇数行,行数是从0开始,结尾数列数都是以0结束。同理偶数行分析。下三角同理分析。我看网上下三角有这样子的办法就是下三角是n*n-对应上三角的值+1。希望对你有帮助。
代码1如下
#include<stdio.h>
#define N 100
void ZigzagMatrix(int a[][N], int n);
int main()
{
int a[N][N],i,j,n;
printf("Input n:\n");
scanf("%d",&n);
if(n>=1&&n<=9)
{
ZigzagMatrix(a,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
else
printf("Input error!\n");
return 0;
}
void ZigzagMatrix(int a[][N], int n)
{
int i,j,k;
k=1;
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
if(i%2==0)
a[i-j][j]=k;
else
a[j][i-j]=k;
k++;
}
}
k=n*n;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=i;j++)
{
if(i%2==0)
a[n-1+j-i][n-1-j]=k;
else
a[n-1-j][n-1+j-i]=k;
k--;
}
}
}
代码2如下
#include<stdio.h>
#define N 100
void ZigzagMatrix(int a[][N], int n);
int main()
{
int a[N][N],i,j,n;
printf("Input n:\n");
scanf("%d",&n);
if(n>=1&&n<=9)
{
ZigzagMatrix(a,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
else
printf("Input error!\n");
return 0;
}
void ZigzagMatrix(int a[][N], int n)
{
int i,j,k;
k=1;
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
if(i%2==0)
{
a[i-j][j]=k;
a[n-1+j-i][n-1-j]=n*n-k+1;
}
else
{
a[j][i-j]=k;
a[n-1-j][n-1+j-i]=n*n-k+1;
}
k++;
}
}
}