c语言写蛇形矩阵


这道题我真的也弄了很久。

算法分析:

首先我们把它分成上三角和下三角。我们可以把上三角赋值想这样子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++;

         }

    }

    

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值