蛇形矩阵的创建


这是记录我做的一道关于蛇形矩阵的文章

1 题目描述

【问题描述】
将1,2,…,n*n个自然数,按蛇形方式存放在二维数组A[n][n]中。“蛇型”方式,即是按“副对角线”平行的各对角线,从左下到右上,再从右上到左下,存放n2个整数。例如:

1 3 4
2 5 8
6 7 9

【输入形式】 输入数组的阶数n。
【输出形式】 打印数据元素按蛇形排列的数组,整数打印的域宽为4。
【样例输入】3
【样例输出】
1 3 4
2 5 8
6 7 9
【样例说明】矩阵的阶数为3,打印按蛇形存放的1~9,注意域宽为4。

2 解决思路

首先一开始,我就开始猜规律,妄想用一种规律来解这道题目。很长很长时间后😅😅,发现这似乎不现实。然后我仿着大脑的思路,试图解决这道问题,结果就解决了。猛然之间有了一种“编程就是仿照人的思路告诉计算机怎么做的过程”感悟。

我们来看样例,发现可以有第一次打印1个,,第二次打印两个,第三次打印3个,第四次打印2个,第五次打印1个这样的规律。这样就可以用for循环控制打印个数。

然后,每一次打印分为两种状态,分别是上行,下行。也就是左下到右上,右上到左下。这样我们可以定义一个记录状态的变量。并且我们还发现。上行和下行是交替进行的。这就相当于解决了一大半问题。

最后一个问题,如何解决第一次到第二次这样的过度呢。我们发现其实一共有两种过度。一种是向下。一种是向右,这样我们定义两种状态。这两种状态也是交替进行的。等等,好像不是,发现如果到了右上角的元素,下一个状态不会改变,再找一找还有没有例外,。。。。。没了。于是,我们就可以针对这种例外做一个判断。

之后,这道题目就做出来了。😁

3 代码

#include<stdio.h>
int main()
{
    int data[100][100];
    int n;
    scanf("%d",&n);
    int point = 2;
    int q=1,w=0;
    int i,j;
    data[0][0] = 1;
    int flag = 1;  //flag为0代表向下,为1代表向右
    int state = 1; //走的状态,上行为1,下行为2
    for (i = 2; i<= n; ++i) {
        for (j = 1; j <= i; ++j) {
            data[q][w] = point++;
            if(state == 1 && j!=i) {
                q--;
                w++;
            } else if (state == 2 && j!=i) {
                q++;
                w--;
            }
        }
        if (state == 1) {
            state = 2;
        } else {
            state = 1;
        }
        if (flag == 1 && w == n-1) {
            flag = 0;
        }
        if (flag == 0 && q == n-1) {
            flag = 1;
        }
        if (flag == 0) {
            q++;
            flag = 1;
        } else {
            w++;
            flag = 0;
        }
    }
    for (i = n-1; i >= 1; --i) {
        for (j = 1; j <= i; ++j) {
            data[q][w] = point++;
            if(state == 1 && j!=i) {
                q--;
                w++;
            } else if (state == 2 && j!=i) {
                q++;
                w--;
            }
        }
        if (state == 1) {
            state = 2;
        } else {
            state = 1;
        }
        if (flag == 1 && w == n-1) {
            flag = 0;
        }
        if (flag == 0 && q == n-1) {
            flag = 1;
        }
        if (flag == 0) {
            q++;
            flag = 1;
        } else {
            w++;
            flag = 0;
        }
    }
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            printf("%4d",data[i][j]);
        }
        printf("\n");
    }
    return 0;
}

到这里这篇文章就结束了。如果有错误,可以在下方评论,或者私聊我😉,我会及时改正的。


文章作者: vrerain
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 vrerain !
评论
  目录