对二维数组进行Zig-Zag扫描(C++)
2010-02-27 13:52
357 查看
对二维数组进行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
;
//给二维矩阵赋值
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扫描方式:
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
;
//给二维矩阵赋值
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++)
- 对一个数组进行zig-zag重新排列
- 如何用C++中的STL对二维数组进行排序
- 生成 ZIG-ZAG 扫描顺序MATLAB代码
- Zig-zag扫描
- c++ 的用 new 和delete 进行二维数组动态内存的创建和删除
- QML界面与Qt/C++代码进行数据交互
- C++ 用libcurl库进行http 网络通讯编程
- c++ vector的用法,以及二维数组的传递和返回
- c++之动态二维数组
- Effective Modern C++ 条款26 避免对通用引用进行重载
- 【C++】使用sstream头文件进行格式转换
- C/C++对Lu系统内置动态对象进行运算符重载
- C++ 二维数组与指针
- c++ 二维数组
- Android 基于google Zxing实现对手机中的二维码进行扫描
- Android调用MediaScanner进行新产生的媒体文件扫描
- 实战c++中的智能指针unique_ptr系列--通过unique_ptr对shared_ptr进行初始化
- 用Eclipse平台进行C/C++开发[转载]