Problem
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
Input
本题有多组数据,每组数据由一个正整数N组成。(N不大于100)
Output
对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。
矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。
Sample Input
5
Sample Output
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
整体观察法思想:
先看输出;将它旋转45度你将看到;
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
其实这样也可以做解了。但是还有跟好的能看的很清楚的.你再让这组数往左边靠你将看到.
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
现在你可以看到什么?你看没行的最后一个元素.1 3 6 10 15.再往斜的继续看得到下行.2 5 9 14.再下.4 8 13.再下.7 12.最后.11.没色做为一行.你再摆下来。
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
不就成了,当然还可以变成向下的蛇型矩阵.我在程序中同样给出来了。也给出了数组转换的过程.
程序:
#include <iostream>
using namespace std;
const int N=100;
int main()
{
int matrix[N][N];
int n;
cout<<"输入矩阵的行数: ";
cin>>n;
int tag=1;//标记符号。
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
matrix[i][j]=tag++;//矩阵输入:
//蛇型矩阵的转换形式。
cout<<endl;
for(i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
cout<<matrix[i][j]<<" ";
cout<<endl;
}
tag=1;
//蛇型矩阵的原型。
cout<<endl;
for( i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
cout<<matrix[j][tag++]<<" ";
tag=1;
cout<<endl;
}
//蛇型矩阵向下型。
cout<<endl;
for(i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
cout<<matrix[j][tag]<<" ";
tag++;
cout<<endl;
}
return 0;
}
程序输出样例:
输入矩阵的行数: 6
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
1 3 6 10 15 21
2 5 9 14 20
4 8 13 19
7 12 18
11 17
16
1 2 4 7 11 16
3 5 8 12 17
6 9 13 18
10 14 19
15 20
21
Press any key to continue
注:其实很多程序中.你不要只注意每个元素的关系.有时你整体的来看会起到很好的效果的。在ACM的题库中我也看到了很多人的解法.有很多就是看到元素间的增减关系.他们写的也很好,不过我觉得我这样很好理解一些.