蓝桥杯训练题解-蛇行矩阵(问题 1097)

原题链接: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
#include
#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;
}

你可能感兴趣的:(算法)