1. 程式人生 > >蛇形矩陣(Z形矩陣),C++實現

蛇形矩陣(Z形矩陣),C++實現

常見的蛇形矩陣是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
實現結果如圖: