蛇形矩陣(Z形矩陣),C++實現
阿新 • • 發佈:2019-02-19
常見的蛇形矩陣是Z型矩陣,如:
1 2 4
3 5 7
6 8 9
仔細發覺規律可以發現:以這個方向的斜線/為迴圈物件時,座標的和是不變的,因此可以通過座標換算出對應的值,C++實現如下:
實現結果如圖:#ifndef _ZSTYLEARR_HPP_ #define _ZSTYLEARR_HPP_ #include <iostream> #include <iomanip> #include <vector> using namespace std; class ZStyleArr { public: ZStyleArr(int N) :width(N) { //初始化矩陣 for (int i = 0; i < width; i++) { vector<int> tempA(width, 0); zArr.push_back(tempA); } } ~ZStyleArr(){} void display() { fillArr(); cout << endl; for (int i = 0; i < width;i++) { for (int j = 0; j < width; j++) cout <<setfill(' ')<<setw(3)<< zArr[i][j] << " "; cout << endl; } } private: void fillArr() { int cols = 0, rows = 0; //行列座標 int tempSum = 0, crSum = 0; //行列和 int filledNum = 0; //以填充的數量 int threshNum = (1 + width)*width / 2; //左上角至對角線的數量,大於該數量後,座標的最小值將遞增 int minRowIndex = 0,minColIndex =0; //最小座標 int arrSize = width*width; //矩陣大小 while (1) { rows = minRowIndex; //初始化行列座標 cols = crSum - rows; while (1) { zArr[rows][cols] = ++filledNum; rows += 1; //行座標加1,下一行 cols = crSum - rows; //每次迴圈,行列座標的和不變,整個矩陣是對稱的 if (rows > width - 1 || rows < minRowIndex || cols<minColIndex || cols>width - 1) { ++crSum; //上一斜線上的座標已經填充完成 if (filledNum >= threshNum) //填充總數超過對角線後,行列座標的最小值會遞增(不再是0) { ++minRowIndex; ++minColIndex; } break; } } //填充總數達到後,退出迴圈 if (filledNum>=arrSize) break; } } const int width; //矩形寬度 vector<vector<int>> zArr; }; #endif