蛇型矩阵的最简解(整体观察法)

蛇行矩阵

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

      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的题库中我也看到了很多人的解法.有很多就是看到元素间的增减关系.他们写的也很好,不过我觉得我这样很好理解一些.

 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值