题目描述

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

输入格式

本题有多组数据,每组数据由一个正整数N组成。(N不大于100)

输出格式

对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。

样例输入

5

样例输出

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

 具体代码及详细分析

方法一:

此方法为本人初写该题目的方案,较为繁琐,但容易想到

要解此题,首先观察题目给的样例输出,找出其中的三层关系。
①每一行中,相邻数的增加关系是依次加1的,如第一行:1->3增加关系是2,3->6增加关系是3,6->10增加关系是4。(所以我们联想到要有一个变量k1且k1++)
②每行的第一个数由上到下,增加关系依次加1,如1->2增加关系是1,2->4增加关系是2,4->7增加关系是3。(所以我们联想到要有一个变量k2且k2++)
③每行的第一个相邻数之间的增加关系之间还存在一个恒为1的增加关系,如第一行1->3增加关系是2,第二行2->5增加关系是3,第三行4->8增加关系是4,那么2->3增加关系是1,3->4增加关系是1,这个增加关系一直都是1,没有变化。(所以我们联想到要有一个常量k3且k3=1)
④每行的数字个数有一个与N有关的减小关系,N是多少,第一行就是多少个数,接下来的每一行数字个数依次减1。

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n, m; cin >> n;
	m = n;
	int num[100][100];
	num[0][0] = 1;
	for (int i = 0; i < n; i++) {
		int a = i + 2;                         //代表每一行前两元素的差
		int b = i + 1;                         //代表第一列前两元素的差
		for (int j = 0; j < m; j++) {
			num[i][j + 1] = num[i][j] + (a++);
		}
		num[i + 1][0] = num[i][0] + (b++);
		m--;
	    }
	m = n;                                    //仍需要初始化m,否则程序会出现错误
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < m - 1; j++) {
			cout << num[i][j] << " ";
		}
		cout << num[i][m - 1] << endl;        //补充每一行最后一数组元素
		m--;                                  
	    }
	cout << num[n - 1][0];
	return 0;
           }

方法二:

找到各个数组之间的关系,即蛇形数组的规律,满足按对角线依次增加的规律

蛇形矩阵的设计思路 JAVA c++蛇形矩阵的设计思路_数据

#include <bits/stdc++.h>
using namespace std;
int main() {
	int x, count = 1, mat[100][100];   //count为计数器
	for (int j = 0; j < 100; j++)      //据上图规律遍历所有斜对角数并赋初值
		for (int k = 0; k <= j; k++)
			mat[j - k][k] = count++;
	cin >> x;
	for (int j = 0; j < x; j++) {      //注意j、k、x之间的关系
		for (int k = 0; k + j < x; k++) cout << mat[j][k] << ' ';
		cout << endl;                  //补充每一行最后一个数组元素的的换行
		} 
	return 0;
}

上述内容皆为本人观点,如有错误欢迎指正