轉載需聲明本出處: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;