Z字形順序輸出方陣

任何轉載需聲明本出處:https://blog.csdn.net/qq_26860179/article/details/80393793

問題:輸入方陣行數row, 列數col, 以"Z"字形順序輸出方陣值

例如輸入:row = 4, col = 3;

輸出:  1   2   6

           3    5   7

           4    8   11

           9    10  12

本人思路:左上角永遠是1,接下來,先向右移動一位,然後右上到左下的順序,然後向下移動一位,接着左下到右上的順序,橫縱座標永遠同時+1或者-1;值得注意的是,其中從右上到左下,如果到達左邊界之前先到了底邊界,則向右移動移動一位,再從左下到右上,同樣的,從左下到右上,如果到達上邊界之前先到右邊界,則向下移動一位,再從右上到左下。把邊界考慮進去更新橫縱座標,整個問題簡單多了。我們不用考慮每一斜行橫縱座標之和是一個常數。

第二個要考慮方向的問題,到哪裏停止?可以發現,不管從左下到右上,還是從右上到左下,達到任一一條邊界就換向,這個可以用row和col的位置信息,以及row+col的奇偶性去判斷。

代碼如下:

#include <iostream>
#include <vector>
using namespace std;

struct MatrixVal                    // 每個位置是一個結構體,存於vector中
{
	int row = 0;                // 每個元素的行座標
	int col = 0;                // 每個元素的列座標
	int val = 0;                // 每個元素的值
};

int get_z_matrix_val(int &row_num, int &col_num, vector<MatrixVal> &matrix_vec);

int main()
{
	int row = 4;
	int col = 3;
	vector <MatrixVal> matrix_vec;

	get_z_matrix_val(row, col, matrix_vec);

	//  屏幕輸出
	for (int i = 0; i < row; i++)
	{
		int col_index = 0;

		for (int col_index = 0; col_index < col; col_index++)
		{
			for (int index = 0; index < matrix_vec.size(); index++)
			{
				if (matrix_vec[index].row == i && matrix_vec[index].col == col_index)
				{
					cout << matrix_vec[index].val;
					cout << " ";
					break;
				}
			}
		}
		
		cout << endl;
	}

	return 0;
}

int get_z_matrix_val(int &row_num, int &col_num, vector<MatrixVal> &matrix_vec)
{
	MatrixVal matrix;
	matrix.row = 0;
	matrix.col = 0;
	matrix.val = 1;
	matrix_vec.push_back(matrix);

	int row = 0;
	int col = 0;

	int i = 1;
	
	while (i < row_num * col_num)
	{
		if ((row + col) % 2 == 0 && row == 0 && col + 1 < col_num)   //右上向左下方
		{
			col++;

			while (col >= 0 && row >= 0 && row < row_num && col < col_num)
			{
				matrix.row = row;
				matrix.col = col;
				matrix.val++;
				matrix_vec.push_back(matrix);
				row++;
				col--;
				i++;
			}

			row--;    // 因爲while裏面最後row和col都變化了,這邊恢復
			col++;
		}


		if ((row + col) % 2 == 0 && col + 1 == col_num)   // 先到達右邊界,向下移動一格,再由右上到左下
		{
			row++;
			while (col >= 0 && row >= 0 && row < row_num && col < col_num)
			{
				matrix.row = row;
				matrix.col = col;
				matrix.val++;
				matrix_vec.push_back(matrix);
				row++;
				col--;
				i++;
			}

			row--;
			col++;

		}


		if ((row + col) % 2 == 1 && col == 0 && row + 1 < row_num)    // 左下向右上移動
		{
			row++;
			while (col >= 0 && row >= 0 && row < row_num && col < col_num)
			{
				matrix.row = row;
				matrix.col = col;
				matrix.val++;
				matrix_vec.push_back(matrix);
				row--;
				col++;
				i++;
			}

			row++;
			col--;
		}

		if ((row + col) % 2 == 1 && row + 1 == row_num)             // 先到下邊界,向右移動一格,再左下到右上
		{
			col++;
			while (col >= 0 && row >= 0 && row < row_num && col < col_num)
			{
				matrix.row = row;
				matrix.col = col;
				matrix.val++;
				matrix_vec.push_back(matrix);
				row--;
				col++;
				i++;
			}

			row++;
			col--;
		}
	}

	return 0;
}

結果 :row = 5; col = 5


row = 4 ; col = 3;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章