解题思路
这段代码的目的是实现一个矩阵的锯齿形(Zigzag)扫描。锯齿形扫描是一种常用于图像处理的技术,特别是在图像压缩领域。在给定的4x4矩阵示例中,这种扫描方式首先从矩阵的左上角开始,然后沿着对角线方向交替向上和向下移动,直到到达矩阵的右下角。
-
定义二维向量
myMatrix
来存储输入的矩阵,这里使用了vector<vector<int>>
。 -
初始化一个布尔变量
isUp
来判断当前的扫描方向是向上还是向下。如果isUp
为true
,表示方向向上;如果为false
,表示方向向下。 -
第一个大循环用于处理矩阵的上半部分(包括对角线),循环变量
i
从0到n-1
。- 如果
isUp
为true
,则从当前对角线的上端点开始,向下扫描到第一行(即对角线上的元素)。 - 如果
isUp
为false
,则从当前对角线的左端点开始,向右扫描到第一列。 - 在每次循环的末尾,改变
isUp
的值,使其从true
变为false
,或从false
变为true
。
- 如果
-
第二个大循环用于处理矩阵的下半部分(不包括对角线),循环变量
i
从n-1
到0,i1
从1到n-1
。- 逻辑与上半部分相同,只是扫描的起始点和终止点不同。
- 这里使用
i1
来控制扫描的起始行或列,而j
和j1
用于控制扫描过程中的行和列的移动。 - 同样,在每次循环的末尾,
isUp
的值会被反转。
完整代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<vector<int>>myMatrix(n, vector<int>(n));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> myMatrix[i][j];
}
}
bool isUp = 1; // 判断方向向上还是向下
for (int i = 0; i < n; i++)
{
if (isUp)
{
for (int j1 = i, j2 = 0; j1 >= 0; j1--, j2++)
{
cout << myMatrix[j1][j2] << " ";
}
}
else
{
for (int j1 = i, j2 = 0; j1 >= 0; j1--, j2++)
{
cout << myMatrix[j2][j1] << " ";
}
}
isUp = (isUp + 1) % 2;
}
for (int i = n - 1, i1 = 1; i >= 0; i--, i1++)
{
if (isUp)
{
for (int j = 0, j1 = n - 1, j2 = i1; j < i; j++, j1--, j2++)
{
cout << myMatrix[j1][j2] << " ";
}
}
else
{
for (int j = 0, j1 = n - 1, j2 = i1; j < i; j++, j1--, j2++)
{
cout << myMatrix[j2][j1] << " ";
}
}
isUp = (isUp + 1) % 2;
}
return 0;
}