順時針由外到內蛇形輸出方陣

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

問題:給定方陣行數row, 列數col,要求從外到內輸出1:row*col;

例: row = 3, col = 4;

輸出:   1   2   3   4

            10 11 12  5

            9   8   7   6

本人思路:方陣可以看成是一個圈由外到內進行遍歷,如果最後無法構成閉環,則單獨展開。

代碼如下:

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

struct MatrixVal                   // 這邊每個元素設計成結構體模式
{
    int row = 0;                   // 每個元素所在行
    int col = 0;                   // 每個元素所在列
    int val = 0;                   // 每個元素的值
};

int acqure(int &x_min, int &x_max, int &y_min, int &y_max, vector<MatrixVal> &matrix_vec)
{
	// 上橫線  由左到右
	MatrixVal matrix;
	for (int x = x_min; x <= x_max; x++)
	{
		if (x == 0 && y_min == 0)
		{
			matrix.row = 0;
			matrix.col = 0;
			matrix.val = 1;
			matrix_vec.push_back(matrix);
		}
		else
		{
			matrix.row = y_min;
			matrix.col = x;
			matrix.val = matrix_vec.back().val+1;
			matrix_vec.push_back(matrix);
		}


	}

	// 右豎線  由上到下
	for (int y = y_min + 1; y <= y_max - 1; y++)
	{
		matrix.row = y;
		matrix.col = x_max;
		matrix.val = matrix_vec.back().val+1;
		matrix_vec.push_back(matrix);
	}


	//  下橫線 由右向左
	for (int x = x_max; x >= x_min; x--)
	{
		matrix.row = y_max;
		matrix.col = x;
		matrix.val = matrix_vec.back().val+1;
		matrix_vec.push_back(matrix);
	}


	//  左豎線  由下到上
	for (int y = y_max - 1; y >= y_min + 1; y--)
	{
		matrix.row = y;
		matrix.col = x_min;
		matrix.val = matrix_vec.back().val+1;
		matrix_vec.push_back(matrix);
	}
	return 0;
}


int get_matrix_val(int row_num, int col_num, vector<MatrixVal> &matrix_vec)
{
	MatrixVal matrix;
	int rect_num = min(row_num, col_num)/2;      // 計算框遍歷需要的次數

	for (int i = 0; i < rect_num; i++)
	{
		int x_min = i;
		int x_max = col_num - 1 - i;
		int y_min = i;
		int y_max = row_num - 1 - i;
		acqure(x_min, x_max, y_min, y_max, matrix_vec);
	}
	
	if (row_num % 2 == 0 && col_num % 2 == 0)      // 如果都爲偶數,則框遍歷就能搞定,返回
	{
		return 0;
	}
	else
	{
		if (row_num % 2 == 1 && col_num % 2 == 1 && row_num == col_num)  //  像5*5這種特殊情況,正中間有一個數;
		{
			matrix.row = rect_num;
			matrix.col = rect_num;
			matrix.val = matrix_vec.back().val+1;
			matrix_vec.push_back(matrix);
		}

		if (row_num > col_num)                          // 如果行數大於列數,框遍歷結束後,正中間有一列
		{
			int y_begin = rect_num;
			int y_end = row_num - rect_num - 1;

			for (int i = y_begin; i <= y_end; i++)
			{
				matrix.row = i;
				matrix.col = rect_num;
				matrix.val = matrix_vec.back().val+1;
				matrix_vec.push_back(matrix);
			}
		}

		if (col_num > row_num)                            // 如果列數大於行數, 正中間有一行
		{
			int x_begin = rect_num;
			int x_end = col_num - 1 - rect_num;
			for (int x = x_begin; x <= x_end; x++)
			{
				matrix.row = rect_num;
				matrix.col = x;
				matrix.val = matrix_vec.back().val+1;
				matrix_vec.push_back(matrix);
			}
		}
	}

	return 0;
}


int main()
{
	int row = 3;
	int col = 4;
	vector <MatrixVal> matrix_vec;
	get_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;
}

結果:row = 3; col = 5;


row = 5; col = 5;


row = 6; col = 5;


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