对二维数组进行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++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vc++/c++ 汉字取拼音首字母
- 下一篇: 使用DBCA工具创建自己的数据库