题目描述
蛇形矩阵是由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;
}
方法二:
找到各个数组之间的关系,即蛇形数组的规律,满足按对角线依次增加的规律
文章来源:https://www.toymoban.com/news/detail-464416.html
#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;
}
上述内容皆为本人观点,如有错误欢迎指正 文章来源地址https://www.toymoban.com/news/detail-464416.html
到了这里,关于蛇行矩阵两种编程方法及详解(c++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!