这是记录我做的一道关于蛇形矩阵的文章
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;
}
到这里这篇文章就结束了。如果有错误,可以在下方评论,或者私聊我😉,我会及时改正的。