任何转载需声明本出处:https://blog.youkuaiyun.com/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;