原题链接:http://www.dotcpp.com/oj/problem1097.html
题目描述
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
输入
本题有多组数据,每组数据由一个正整数N组成。(N不大于100)
输出
对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。
样例输入
5
样例输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
解题思路
0 - 1 3 6 10 15
1 - 2 5 9 14
2 - 4 8 13
3 - 7 12
4 - 11
我们来分析一下,像这种题都是要联系到行与列的,
对于第0 行 第一个数是 1 1 + 2 (0+2) 1+2 +3 1+2+3+4 1+2+3+4+5
对于 第1行 第一个数是 2 2+3(1+2) 2+3+4 2+3+4+5
对于第2行 第一个数是 4 4+4(2+2) 4+4+5
对于第3行 第一个数是 7 7+5(3+2)
对于第4行 第一个数是 11
通过观察 每行的第二个数 = 第一个数+第i行+2 其后的是 累加 只要确定了 起始加的 q 其后只需递增q来相加就可以了 而 q = 第 i行+2
这里还得再确定 每行的起始数字
0 - 1
1 - 2
2 - 4
3 - 7
4 -11
这里很容易看出(0行的起始数是1 这个定了)2 = 1(上一行的起始值)+1(当前行数) 4 = 2(上一行的起始值)+2(当前行数) 7 =4(上一行的起始值)+3(当前行数) 11 = 7(上一行的起始值)+4(当前行数)
所以我们用数组处理一下
文字表达:当前值 等于 上一行的初始值+当前行数
表达式:a[i] = a[i-1]+i
还有一点就是
从第1行开始,每一行的元素个数都比上一行少一
参考代码
#include<iostream>
#include<cstdio>
#define Max 101
using namespace std;
int main()
{
int n,a[Max];
int p=1,q;
int k;
//循环录入每行的初始值
for(int i = 0;i < 101;++i)
{
if(i != 0)
{
a[i] = a[i-1]+i;
}
else
{
a[i] = 1;
}
}
while(cin>>n)
{
//k是列数
k = n;
for(int i=0;i <n;++i)
{
p = a[i];
q = i+2;
for(int j=0;j < k;++j)
{
if(j == 0)
{
cout << p <<" ";
}else
{
p=p+q;
q +=1;
//到达尾部就不要输出空格
if(j ==k-1)
{
cout << p ;
}else
{
cout << p <<" ";
}
}
}
--k; //列数相对上一行少1
cout<<endl;
}
}
return 0;
}