蛇形矩阵(不完全)
2015-11-13 22:43
197 查看
蛇形矩阵
【问题描述】
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
【数据输入】数据由一个正整数N组成。(N不大于100)
【数据输出】输出一个N行的蛇形矩阵。
【样例输入】
5
【样例输出】
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
解题思路:
1.有两种方法,第一种是直接使用模拟来做,第二种是利用对角线设计的算法来做;
第一种主要注意换行的实现,具体见代码;
第二种主要注意每个元素对应对角线前面所有对角线之和等于前一个对角线中最大的一个;
2.注意每行最大的一列结束后要行。
具体代码如下:
第一种:
第二种:
【问题描述】
蛇形矩阵是由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; }
相关文章推荐
- 第二百二十五 how can I 坚持
- 关于ini文件读写的一些问题
- win10 uwp 通知Toast
- phpMyAdmin 高级功能未全部设置,部分功能不可用
- Linux下启动weka出现Error, not in CLASSPATH?解决方案
- win10 uwp 通知Toast
- LeetCode 26 Remove Duplicates from Sorted Array(从已排序数组中移除重复元素)
- JAVA-数据类型
- 常用css
- Java各类格式转换
- c bmp parse
- vim自定义快捷键
- mysql之修改表引擎
- NetBeans常用快捷键
- Android最牛的开源整理
- 信号量、互斥锁,读写锁和条件变量的区别 http://blog.chinaunix.net/uid-20671208-id-4935154.html
- 冒泡排序
- 【Java】Java垃圾收集
- 注册监听的5种方式
- C# Emgu CV学习笔记二之图像读写的两种方法