蛇形矩阵(不完全)

蛇形矩阵
【问题描述】
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
【数据输入】数据由一个正整数N组成。(N不大于100)
【数据输出】输出一个N行的蛇形矩阵。
【样例输入】
5
【样例输出】
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

解题思路:
1.有两种方法,第一种是直接使用模拟来做,第二种是利用对角线设计的算法来做;
第一种主要注意换行的实现,具体见代码;
第二种主要注意每个元素对应对角线前面所有对角线之和等于前一个对角线中最大的一个;
2.注意每行最大的一列结束后要行。

具体代码如下:
第一种:

#include <stdio.h>
#include <string.h>
 int main()
 {                                                               
     int i,j,total,n,x,y;                 
     int a[105][105];
     scanf("%d",&n);
     a[1][1]=1;                                            
     x=y=1;                                           
     total=1;
     while(total<(n+1)*n/2)//当然对于这题也可以用行来控制
     {
         x=x+y;//可能就这步难想到,但也可以替代,比如我记下每一次上一次开头的行坐标为temp,下一次只要 x=++temp即可,因为上一次是对角线赋值所以行加列是固定值,且是开始的行坐标加1 
         y=1;
         a[x][y]=++total;
         while(x-1>=1)
         {
             a[--x][++y]=++total;
         }

     }
     for (i=1;i<=n;i++)
     {
    for (j=1;j<=n+1-i;j++)
     printf("%4d",a[i][j]);
     printf("\n");
     }
 }

第二种:

#include <stdio.h>
 int main()   
 {
     int i,j,k,sum,n;
     scanf("%d",&n);
     for (i=1;i<=n;i++)
        for (j=1;j<=n+1-i;j++)//每一行打印多少个元素
     {
         k=i+j-2;                  //算出它之前有几条对角线
         sum=(k+1)*k/2;     //前k条对角线的和,那么加上列数就是第(i,j)的值
         if (j==n+1-i)          //如果是每一行的最后一列,那么要换行
            printf("%d\n",sum+j);
         else
            printf("%d ",sum+j);
     }
     return 0;
}

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