/**
* 描述:打印zigzag矩阵
*       0  1  5  6 14 15 27 28
*       2  4  7 13 16 26 29 42
*       3  8 12 17 25 30 41 43
*       9 11 18 24 31 40 44 53
*      10 19 23 32 39 45 52 54
*      20 22 33 38 46 51 55 60
*      21 34 37 47 50 56 59 61
*      35 36 48 49 57 58 62 63
*
* Date: 2011-08-08
*/
#include <iostream>
#include <iomanip>
using namespace std;
int a[100][100];
void PrintZigzag(int n)
{
int value = 0;
int i,j,k;
int num;
//上三角
for (i=0; i<n; i++)
{
num = 0;
if (0 == i % 2)
{/*偶数*/
j = i;
k = 0;
while (num++ <= i)
{
a[j--][k++] = value++;
}
}
else
{/*奇数*/
j = 0;
k = i;
while (num++ <= i)
{
a[j++][k--] = value++;
}
}
}
//下三角
for (i = n-2; i >= 0; i--)
{
num = 0;
if (0 == i % 2)
{/*偶数*/
j = n - 1;
k = n -1 - i;
while (num++ <= i)
{
a[j--][k++] = value++;
}
}
else
{/*奇数*/
j = n - 1 - i;
k = n - 1;
while (num++ <= i)
{
a[j++][k--] = value++;
}
}
}
}
/**
* test
*/
int main()
{
int n, i, j;
cin >> n;
for(i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
a[i][j] = 0;
}
}
PrintZigzag(n);
for(i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cout << setw(4) << a[i][j];
}
cout << endl;
}
return 1;
}
方法虽蠢却易理解。
通过观察zigzag矩阵可发现几个特点:
  1. 左上三角(以对角线方向查看)个数从1递增至n(矩阵维数),右下三角从n-1递减至1。则可以将zigzag矩阵分为上三角和下三角两部分处理。
  2. 观察zigzag矩阵,以对角线方向计(行数从0开始计数),则偶数行规律是:从左到右;奇数行规律是:从右到左。则再分为奇偶行进行处理。
因此,编程中:
     1. (i,j)是否在右下三角的判断标准是i+j > N;
     2. 按照斜行处理。

当然,有一种十分巧妙的方法如下。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int N;
int s, i, j;
int squa;
scanf("%d", &N);
/* 分配空间 */
int **a = (int **)malloc(N * sizeof(int *));
if(a == NULL)
return 0;
for(i = 0; i < N; i++)
{
if((a[i] = (int *)malloc(N * sizeof(int))) == NULL)
{
while(--i>=0)
free(a[i]);
free(a);
return 0;
}
}
/* 数组赋值 */
squa = N*N;
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
{
s = i + j;
if(s < N) /*上三角*/
{
a[i][j] = s*(s+1)/2 + (((i+j)%2 == 0)? j : i);
}
else
{ /*下三角*/
s = (N-1-i) + (N-1-j);
a[i][j] = squa - s*(s+1)/2 - (N - (((i+j)%2 == 0)? j : i));
}
}
/* 打印输出 */
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
printf("%6d", a[i][j]);
}
printf("\n");
}
return 1;
}
通过观察zigzag数组,可以发现,对角线上(i+j)为常数,记为s(s=i+j)。(i为行数,j为列数)
仍然是分为上三角和下三角两部分处理。
对于上三角,每一个斜线上的个数比上一行多一个。且,每个斜线上的第一个元素表示了该斜线之前元素的个数。运用等差数列求和公式,则每一斜线第一个元素的值为 (1 + (i+j)) * (i+j) / 2 = (1 + s) * s / 2
斜线中的任意元素可表示为s*(s+1)/2+i(此处来个奇偶判断就知道是加i还是加j了。)那么就不难理解代码中 a[i][j] = s*(s+1)/2 + (((i+j)%2 == 0)? j : i);的含义了。
对于下三角,斜线上元素的个数是递减的。反过来看可以看成是递增的,就仍然可以套用等差数列求和公式,求出剩下的元素的个数,用总元素个数减去剩下的元素个数就是当前斜线上的第一个元素值。
我们知道所有元素的个数是n*n,则该斜线的第一个元素值为n*n - s*(s+1)/2。此处的s就不是i+j了,而是(n-1-i)+(n-1-j)。这样也不难理解代码中s = (N-1-i) + (N-1-j);  a[i][j] = squa - s*(s+1)/2 - (N - (((i+j)%2 == 0)? j : i));两句的含义了。

转自: http://blog.163.com/yangjun1988422@126/blog/static/4741291720117842634276/

打印zigzag矩阵相关推荐

  1. 打印zigtag矩阵

    /**  * 描述:打印zigzag矩阵  *       0  1  5  6 14 15 27 28  *       2  4  7 13 16 26 29 42  *       3  8 1 ...

  2. Python实现打印螺旋矩阵功能的方法

    Python实现打印螺旋矩阵功能的方法 本文实例讲述了Python实现打印螺旋矩阵功能的方法.分享给大家供大家参考,具体如下: 一.问题描述 输入N, 打印 N*N 螺旋矩阵 比如 N = 3,打印: ...

  3. Java黑皮书课后题第8章:**8.14(探讨矩阵)编写程序,提示用户输入一个方阵的长度,随机地在矩阵中填入0和1,打印这个矩阵,然后找出整行、整列或者对角线都是1或0的行、列和对角线

    **8.14(探讨矩阵)编写程序,提示用户输入一个方阵的长度,随机地在矩阵中填入0和1,打印这个矩阵,然后找出整行.整列或者对角线都是1或0的行.列和对角线 题目 题目描述与运行示例 破题 代码 题目 ...

  4. Java黑皮书课后题第8章:*8.10(最大的行和列)编写一个程序,在一个4*4的矩阵中随机填入0和1,打印该矩阵,分别找到第一个具有最多1的行和列

    *8.10(最大的行和列)编写一个程序,在一个4*4的矩阵中随机填入0和1,打印该矩阵,分别找到第一个具有最多1的行和列 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 8.10(最大 ...

  5. 使用numpy.sin()打印矢量/矩阵元素的正弦值 使用Python的线性代数

    Prerequisite: 先决条件: Defining a Vector 定义向量 Defining a Matrix 定义矩阵 Numpy is the library of function t ...

  6. 一种打印螺旋式矩阵的方法

    用户输入一个维度,打印从中心向外逆时针旋转的矩阵,左上角为最后一个数.例如输入5,输出为: 24 23 22 21 20 09 08 07 06 19 10 01 00 05 18 11 02 03 ...

  7. 蛇形矩阵 java_Java打印蛇形矩阵

    具体的题目名字忘记了,之前记得有个算法题目,根据给出的整数打印有规律的矩阵. 当n=3: 1 2 3 8 9 4 7 6 5 当n=4: 1 2 3 4 12 13 14 5 11 16 15 6 1 ...

  8. 使用numpy.tanh()打印矢量/矩阵元素的双曲正切值 使用Python的线性代数

    Prerequisite: 先决条件: Defining a Vector 定义向量 Defining a Matrix 定义矩阵 Numpy is the library of function t ...

  9. zigzag矩阵按照之字形线路产生方法(C++)

    #include<iostream> using namespace std;void zigzag(int**M, int N) {/** example N=5 结果* 0 1 5 6 ...

最新文章

  1. tensorflow-gpu
  2. OPENCV标定外参
  3. 算法 - 插入排序(C#)
  4. 两台Oracle服务器,使用udl测试连接
  5. 如何保证Linux服务器的安全
  6. python中print用法
  7. bash ./php-memcache.sh,PHP+shell脚本操作Memcached和Apache Status的实例分享
  8. C#.Net工作笔记006---关于各种四舍五入_小数点保留第几位等操作_随时更新
  9. 谈谈var变量提升以及var,let,const的区别
  10. S7-1500 CPU、显示器、ET 200SP CPU 和 ET 200pro CPU 的固件更新方法
  11. 原创玄幻小说--那时花开--第一章前序
  12. python爬虫——爬取豆瓣top250电影信息
  13. sizebox模型下载_css盒子模型:内联盒模型、width、height、替换元素、边距、border...
  14. python选题背景_选题背景和意义
  15. zippo蚀刻计算机键盘,【图片】蚀刻机自己填漆【zippo吧】_百度贴吧
  16. PM,RD,FE,UE,UI,QA等开发常见部门简称
  17. Maven之pom.xml配置文件详解
  18. 金三银四最新Java面试题总结前199+1页都在这里了,非常详细
  19. bp神经网络模式识别,bp神经网络数字识别
  20. 手机wps怎么改html文件后缀名,手机WPS如何制作个人简历 WPS一键修改文档重命名方法分享...

热门文章

  1. 05_DecisionTree_统计学习方法
  2. Pycrypto与RSA密码技术
  3. 守护进程之PHP实现
  4. java中的final的使用
  5. 手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)【转】
  6. 【Win10 应用开发】实现数据的增量加载
  7. Exchange2010 SP1部署边缘服务器
  8. shell tr命令
  9. log4net 使用手记
  10. layer.prompt添加多个输入框