现在的位置: 首页 > 综合 > 正文

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

2018年04月03日 ⁄ 综合 ⁄ 共 1967字 ⁄ 字号 评论关闭

对二维数组进行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();
}

 

运行结果如下图:

抱歉!评论已关闭.