# 对二维数组进行Zig-Zag扫描(C++)

下图是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(); }

原文作者：Z字形编排问题
原文地址: https://blog.csdn.net/markman101/article/details/6232048
本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。