对二维数组进行Zig-Zag扫描(C++)
对二维数组进行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++)相关推荐
- 技术图文:如何在Python中定义二维数组?
背景 前几天,有位同学问我如下的问题: "temp[0][0]修改后,为什么temp[1][0].temp[2][0]也发生了变化?" "在Python中二维数组是怎样定 ...
- vb 实现二维数组(矩阵)转置。_笃学不倦|数组的定义
Hi~ o(* ̄▽ ̄*)ブ艾睿宝迪,又和大家见面了.这节课讲讲关于数组的那些事儿! 咳咳,今天这节课非常重要,请大家认真听讲并记好笔记呦!现在老司机带大家开车了! 数组可以看成是一种特殊的线性表,其特 ...
- es6一维数组转二维数组_技术图文:Numpy 一维数组 VS. Pandas Series
背景 Numpy 提供的最重要的数据结构是 ndarray,它是 Python 中 list 的扩展. Pandas 提供了两种非常重要的数据结构 Series和DataFrame. Numpy 中的 ...
- AcWing之二维数组的查找
题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 样例 输入数组: [ [ ...
- php 冒泡排序数组,php一维二维数组键之冒泡排序
php一维二维数组键之冒泡排序 功能:对数组进行重新排序. 说明:冒泡排序 (一维数组)(二维数组某个健排序) 两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据 ...
- python随机生成二维列表_对python产生随机的二维数组实例详解
对python产生随机的二维数组实例详解 最近找遍了python的各个函数发现无法直接生成随机的二维数组,其中包括random()相关的各种方法,都没有得到想要的结果.最后在一篇博客中受到启发,通过列 ...
- matlab如何读取二维数组,Matlab从csv文件中读取多个二维数组
我有一个csv文件,它包含2列4列数组,但行数不等.例如:Matlab从csv文件中读取多个二维数组 2, 354, 23, 101 3, 1023, 43, 454 1, 5463, 45, 765 ...
- matlab查找鞍点的位置,找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该...
/* 二维数组中的鞍点,即该位置上的元素在该行上最大.在该列上最小.也可能没有鞍点 二维数组鞍点判断,要逐个要素进行确认,并用二维数组记录满足各要素时的坐标, 之后进行各性质重合对比来确定,也就是说, ...
- Java IDEA Debug进制二维数组
1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 如何加断点 选择 ...
最新文章
- Head First设计模式之目录
- java:不同数据类型的转换规则
- 借evdev之力 Linux全局热键魔改造
- 协议转换器是怎么分类的?主要有哪些类别?
- 哥谈的是语言,不是寂寞
- LeetCode 135. 分发糖果(DP)
- sata接口 图解 定义_硬盘有几个接口 硬盘不同接口介绍【详解】
- 使用.NET Core MVC Web应用程序中的ResponseCache属性处理缓存
- 给你一份详细的 Spring Boot 知识清单,史上最全,建议收藏
- TanDEM-X 90m DEM介绍与下载
- Java 方法的反射
- scratch3.0入门
- 《增长黑客》节选与笔记
- 20211104 为什么相似矩阵的迹相同
- 怎么给视频去水印?手把手教你去水印
- JZOJ.5289【NOIP2017模拟8.17】偷笑
- 机关干部的21条人际关系准则
- Photoshop设计一款Iphone风格导航菜单教程
- HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)
- 精益质量管理简析(转载)
热门文章
- 异常检测时间序列_时间序列的无监督异常检测
- 产品观念:更好的捕鼠器_故事很重要:为什么您需要成为更好的讲故事的人
- koa2异常处理_读 koa2 源码后的一些思考与实践
- leetcode 129. 求根到叶子节点数字之和(先序遍历)
- 程序编写经验教训_编写您永远都不会忘记的有效绩效评估的经验教训。
- 数据科学项目_完整的数据科学组合项目
- 如何使用Python处理丢失的数据
- C# 动态创建数据库三(MySQL)
- 【CTSC2017】【BZOJ4903】吉夫特 卢卡斯定理 DP
- odoo10学习笔记十四:mixin其他功能模块