对二维数组进行Zig-Zag扫描(C++),先自定义了一个类,类中有个函数Run()来实现这个扫描过程,二维数组是动态分配空间以及随机赋值的。

下图是Zig-Zag扫描方式:

CZigZag.h:

#include<iostream>
using namespace std;

typedef struct CPoint
{
 int x;
 int y;
}Point;

class ZigZag
{
private:
 const int M; //矩阵的行数
 const int N; //矩阵的列数
 Point p[4];  //4个扫描方向
 int **arr;  //指向二维矩阵的指针

public:
 ZigZag(int m, int n): M(m), N(n)
 { 
  Init();
 }
 ~ZigZag();
 void Init();
 void Run();
 int Jump(Point & cp, int i, int & c);
 void DisplayArray();
 void DisplayElement(Point p);
};

ZigZag::~ZigZag()
{
 for(int i = 0; i < M; i++)
  delete arr[i];
 delete arr;
}

void ZigZag::Init()     //给二维矩阵分配空间并赋值
{
 int i, j;

//给四个扫描方向赋值
 p[0].x = 0,  p[0].y = 1;
 p[1].x = 1,  p[1].y = -1;
 p[2].x = 1,  p[2].y = 0;
 p[3].x = -1, p[3].y = 1;

//分配二维空间
 arr = new int*[M];    //arr指向一个指针数组(指针数组中每个元素将指向一个数组)
 for(i = 0; i < M; i++)
  arr[i] = new int[N];

//给二维矩阵赋值
 for(i = 0; i < M; i++)
  for(j = 0; j < N; j++)
   arr[i][j] = rand();  //随机赋值
}

void ZigZag::Run()
{
 DisplayArray();
 cout<<endl;

Point cp;
 int i = -1;      //表示刚才访问的是第一个元素
 int c = 1;
 cp.x = 0;
 cp.y = 0;

DisplayElement(cp);    //访问第一个元素,输出元素坐标和值
 while(c < M * N)    
 {
  i = Jump(cp, i, c);   //继续循环访问
 }  
}

//根据当前元素所在位置(cp)和前一个扫描方向(i)来扫描下一个元素
int ZigZag::Jump(Point & cp, int i, int & c)
{
 Point tp;
 if(c == M * N)
  return -1;

if(i == -1)
 {
  if(N > 1) //矩阵至少有2列
   i = 0;
  else  //矩阵只有一列
   i = 2;
 }
 else if(i == 0)
 {
  if(cp.x < M-1) 
   i = 1;
  else if(cp.x == M-1 && cp.x > 0 && cp.y < N-1)
   i = 3;
  else
   i = 0;
 }
 else if(i == 1)
 {
  if(cp.x < M-1 && cp.y > 0)
   i = 1;
  else if(cp.x < M-1 && cp.y == 0)
   i = 2;
  else
   i = 0;
 }
 else if(i == 2)
 {
  if(cp.y == 0 && cp.y < N-1)
   i = 3;
  else if(cp.y == N-1 && cp.y > 0 && cp.x < M-1)
   i = 1;
  else
   i = 2;
 }
 else// if(i == 3)
 {
  if(cp.x == 0 && cp.y < N-1)
   i = 0;
  else if(cp.x > 0 && cp.y < N-1)
   i = 3;
  else
   i = 2;
 }
 
 tp = cp;
 cp.x = tp.x + p[i].x;
 cp.y = tp.y + p[i].y;
 DisplayElement(cp);
 c++;

return i;
}

void ZigZag::DisplayArray()
{
 for(int i = 0; i < M; i++)
 {
  for(int j = 0; j < N; j++)
   cout<<arr[i][j]<<"/t";
  cout<<endl;
 }
}

void ZigZag::DisplayElement(Point p)
{
 cout<<"arr["<<p.x<<"]["<<p.y<<"] = "<<arr[p.x][p.y]<<endl;
}

Main.cpp:

#include<iostream>
#include"CZigZag.h"

using namespace std;

void main()
{
 ZigZag z(4, 4);
 z.Run();
}

运行结果如下图:

对二维数组进行Zig-Zag扫描(C++)相关推荐

  1. 技术图文:如何在Python中定义二维数组?

    背景 前几天,有位同学问我如下的问题: "temp[0][0]修改后,为什么temp[1][0].temp[2][0]也发生了变化?" "在Python中二维数组是怎样定 ...

  2. vb 实现二维数组(矩阵)转置。_笃学不倦|数组的定义

    Hi~ o(* ̄▽ ̄*)ブ艾睿宝迪,又和大家见面了.这节课讲讲关于数组的那些事儿! 咳咳,今天这节课非常重要,请大家认真听讲并记好笔记呦!现在老司机带大家开车了! 数组可以看成是一种特殊的线性表,其特 ...

  3. es6一维数组转二维数组_技术图文:Numpy 一维数组 VS. Pandas Series

    背景 Numpy 提供的最重要的数据结构是 ndarray,它是 Python 中 list 的扩展. Pandas 提供了两种非常重要的数据结构 Series和DataFrame. Numpy 中的 ...

  4. AcWing之二维数组的查找

    题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 样例 输入数组: [ [ ...

  5. php 冒泡排序数组,php一维二维数组键之冒泡排序

    php一维二维数组键之冒泡排序 功能:对数组进行重新排序. 说明:冒泡排序 (一维数组)(二维数组某个健排序) 两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据 ...

  6. python随机生成二维列表_对python产生随机的二维数组实例详解

    对python产生随机的二维数组实例详解 最近找遍了python的各个函数发现无法直接生成随机的二维数组,其中包括random()相关的各种方法,都没有得到想要的结果.最后在一篇博客中受到启发,通过列 ...

  7. matlab如何读取二维数组,Matlab从csv文件中读取多个二维数组

    我有一个csv文件,它包含2列4列数组,但行数不等.例如:Matlab从csv文件中读取多个二维数组 2, 354, 23, 101 3, 1023, 43, 454 1, 5463, 45, 765 ...

  8. matlab查找鞍点的位置,找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该...

    /* 二维数组中的鞍点,即该位置上的元素在该行上最大.在该列上最小.也可能没有鞍点 二维数组鞍点判断,要逐个要素进行确认,并用二维数组记录满足各要素时的坐标, 之后进行各性质重合对比来确定,也就是说, ...

  9. Java IDEA Debug进制二维数组

    1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 如何加断点 选择 ...

最新文章

  1. Head First设计模式之目录
  2. java:不同数据类型的转换规则
  3. 借evdev之力 Linux全局热键魔改造
  4. 协议转换器是怎么分类的?主要有哪些类别?
  5. 哥谈的是语言,不是寂寞
  6. LeetCode 135. 分发糖果(DP)
  7. sata接口 图解 定义_硬盘有几个接口 硬盘不同接口介绍【详解】
  8. 使用.NET Core MVC Web应用程序中的ResponseCache属性处理缓存
  9. 给你一份详细的 Spring Boot 知识清单,史上最全,建议收藏
  10. TanDEM-X 90m DEM介绍与下载
  11. Java 方法的反射
  12. scratch3.0入门
  13. 《增长黑客》节选与笔记
  14. 20211104 为什么相似矩阵的迹相同
  15. 怎么给视频去水印?手把手教你去水印
  16. JZOJ.5289【NOIP2017模拟8.17】偷笑
  17. 机关干部的21条人际关系准则
  18. Photoshop设计一款Iphone风格导航菜单教程
  19. HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)
  20. 精益质量管理简析(转载)

热门文章

  1. 异常检测时间序列_时间序列的无监督异常检测
  2. 产品观念:更好的捕鼠器_故事很重要:为什么您需要成为更好的讲故事的人
  3. koa2异常处理_读 koa2 源码后的一些思考与实践
  4. leetcode 129. 求根到叶子节点数字之和(先序遍历)
  5. 程序编写经验教训_编写您永远都不会忘记的有效绩效评估的经验教训。
  6. 数据科学项目_完整的数据科学组合项目
  7. 如何使用Python处理丢失的数据
  8. C# 动态创建数据库三(MySQL)
  9. 【CTSC2017】【BZOJ4903】吉夫特 卢卡斯定理 DP
  10. odoo10学习笔记十四:mixin其他功能模块