真题演练-蛇形矩阵

题目:
从键盘任意输入一个自然数n(n表示矩阵的大小,假设不超过100),请编程输出一个n*n的蛇形矩阵。

如果输入的n不是蔼然书或者输入了不合法的数字,则输出“Input error!”。
函数原型: void ZigzagMatrix(int a[][N], int n);
函数功能:计算n*n的蛇形矩阵

提示:用两个双重循环分别计算n*n矩阵的左上三角和右下三角,设置一个计数器从1开始记录当前要写入矩阵的元素值,每次写完一个计数器加1,在计算左上角和右下角矩阵元素时,分奇数和偶数两种情况考虑待写入的元素在矩阵中的行列下标位置。

程序运行结果示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解析:

#include <stdio.h>
#define N 100

void ZigzagMatrix(int a[][N], int n);
void PrintMatrix(int a[][N],int n);
void ZigzagMatrix(int a[][N], int n)
{
    int i,j,count,temp;
    //处理左上三角,从a[0][0]开始正序输出
       for(i=0;i<n;i++)
       {
           if(i%2==0)
           {
               temp=i*(i+1)/2+1;
               a[i][0]=temp;
               for(j=1;j<=i;j++)
               {
                   temp++;
                   a[i-j][j]=temp;
               }
           }
           if(i%2==1)
           {
               temp=i*(i+1)/2+1;
               a[0][i]=temp;
               for(j=1;j<=i;j++)
               {
                   temp++;
                   a[j][i-j]=temp;
               }
           }
       }

       //处理右下三角,从a[n][n]开始倒序输出
       for(i=0;i<n-1;i++)
       {
           if(i%2==0)
           {
               temp=n*n-i*(i+1)/2;
               a[n-1-i][n-1]=temp;
               for(j=1;j<=i;j++)
               {
                   temp--;
                   a[n-1-i+j][n-1-j]=temp;
               }
           }
           if(i%2==1)
           {
               temp=n*n-i*(i+1)/2;
               a[n-1][n-1-i]=temp;
               for(j=1;j<=i;j++)
               {
                   temp--;
                   a[n-1-j][n-1-i+j]=temp;
               }
           }
       }
}

void PrintMatrix(int a[][N],int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            printf("%4d",a[i][j]);
        printf("\n");
    }
}

int main()
{
    int n;
    printf("Input n:\n");
    scanf("%d",&n);
    int a[N][N]={0};
    if(n>0&&n<=100)
    {
        ZigzagMatrix(a,n);
        PrintMatrix(a,n);
    }
    else
        printf("Input error!");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值