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