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

《Z字形顺序输出方阵》

row = 4 ; col = 3;

《Z字形顺序输出方阵》

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/qq_26860179/article/details/80393793
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞