蛇形矩阵(C语言)

目录

一、题目

二、分析

三、完整代码


一、题目

题目描述 

给你一个整数n,输出n∗n的蛇形矩阵。

输入描述:

输入一行,包含一个整数n

输出描述:

输出n行,每行包含n个正整数,通过空格分隔。

1<=n<=1000

示例1

输入

4

输出

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

二、分析

1.定义一个大于n*n的二维数组a 

蛇形矩阵(C语言)_第1张图片

2.给a[1][1]赋值为1

蛇形矩阵(C语言)_第2张图片

 3.按照红线顺序对数组赋值

 蛇形矩阵(C语言)_第3张图片

 进入循环,对每一条红线(先向左下方向,再向下,再向右上方向)依次赋值

定义f为一个数,用于赋值给数组,每次使用后加1。

  ①蛇形矩阵(C语言)_第4张图片

for(j=0;;j++) //向左下
        {
            if(1+j<=n&&i-j<=n)
            {
                a[1+j][i-j]=f;
                f++;
            }
            
            if(i-j==1)  break;//如果循环中赋值到了第一列,则停止循环,退出循环
        }

其中的 if(1+j<=n&&i-j<=n)蛇形矩阵(C语言)_第5张图片

需要这行代码的原因是由于定义的二维数组是大于n*n的,所以每次赋值需要判断是不是在n*n的范围内,若不存在则不赋值,f不变。 如图假设n=4时,到最左下角时,超出n*n的范围,则对最左下角不赋值,并且f不变。

以下相同。

 

蛇形矩阵(C语言)_第6张图片

 

if(j+2<=n)//判断a[j+2][1]是不是在n*n的范围内
    {
        a[1+j+1][1]=f;
        f++;
    }

 ③蛇形矩阵(C语言)_第7张图片

 

for(k=1;;k++) //右上
        {
            if(j+2-k<=n&&1+k<=n)
            {
                 a[j+2-k][1+k]=f;f++;
            }
           
            if(j+2-k==1) break;//如果循环中赋值到了第一行,则停止循环,退出循环
        }

最后进入循环,给下一条红线进行依次赋值。

三、完整代码

#include
int main()
{
    int n;
    scanf("%d",&n);
    int i,j,k;
    int a[1100][1100]={0};
    int f=1;
    a[1][1]=f;f++;
    for(i=2;i<=n*2;i+=2)
    {
        for(j=0;;j++) //向左下
        {
            if(1+j<=n&&i-j<=n)
            {
                a[1+j][i-j]=f;
                f++;
            }
            
            if(i-j==1)  break;
        }
        
        if(j+2<=n)
        {a[1+j+1][1]=f;f++;}// 向下一格
        
        for(k=1;;k++) //向右上
        {
            if(j+2-k<=n&&1+k<=n)
            {
                 a[j+2-k][1+k]=f;f++;
            }
           
            if(j+2-k==1) break;
        }
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
    
}

你可能感兴趣的:(矩阵,c语言,算法)