这里我来详细讲解一下“C++实现:螺旋矩阵的实例代码”的完整攻略。
1. 算法分析
螺旋矩阵是一个常见的面试题,我们需要按照一定的顺序遍历矩阵中的元素。我们以一个4x4的矩阵为例,来分析一下遍历的顺序:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
我们可以发现,对于这个矩阵,其顺时针遍历的顺序为1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。我们可以将这个过程分解成四个部分:
- 从左向右遍历一行;
- 从上向下遍历一列;
- 从右向左遍历一行;
- 从下向上遍历一列。
重复这四个步骤,直到所有元素都被遍历过为止。
2. 思路分析
根据上面的算法分析,我们可以得到一个大致的代码框架:
void printMatrix(vector<vector<int>> matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
int start = 0;
while (rows > start * 2 && cols > start * 2) {
printMatrixInCircle(matrix, rows, cols, start);
start++;
}
}
void printMatrixInCircle(vector<vector<int>> matrix, int rows, int cols, int start) {
int endX = cols - 1 - start;
int endY = rows - 1 - start;
// 从左向右遍历一行
for (int i = start; i <= endX; i++) {
cout << matrix[start][i] << " ";
}
// 从上向下遍历一列
if (start < endY) {
for (int i = start + 1; i <= endY; i++) {
cout << matrix[i][endX] << " ";
}
}
// 从右向左遍历一行
if (start < endX && start < endY) {
for (int i = endX - 1; i >= start; i--) {
cout << matrix[endY][i] << " ";
}
}
// 从下向上遍历一列
if (start < endX && start < endY - 1) {
for (int i = endY - 1; i >= start + 1; i--) {
cout << matrix[i][start] << " ";
}
}
}
3. 示例说明
示例1
假设我们现在有一个3x3的矩阵,其元素如下:
1 2 3
4 5 6
7 8 9
按照顺时针遍历的顺序输出应该为:
1 2 3 6 9 8 7 4 5
代码实现如下:
#include <iostream>
#include <vector>
using namespace std;
void printMatrixInCircle(vector<vector<int>> matrix, int rows, int cols, int start) {
int endX = cols - 1 - start;
int endY = rows - 1 - start;
// 从左向右遍历一行
for (int i = start; i <= endX; i++) {
cout << matrix[start][i] << " ";
}
// 从上向下遍历一列
if (start < endY) {
for (int i = start + 1; i <= endY; i++) {
cout << matrix[i][endX] << " ";
}
}
// 从右向左遍历一行
if (start < endX && start < endY) {
for (int i = endX - 1; i >= start; i--) {
cout << matrix[endY][i] << " ";
}
}
// 从下向上遍历一列
if (start < endX && start < endY - 1) {
for (int i = endY - 1; i >= start + 1; i--) {
cout << matrix[i][start] << " ";
}
}
}
void printMatrix(vector<vector<int>> matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
int start = 0;
while (rows > start * 2 && cols > start * 2) {
printMatrixInCircle(matrix, rows, cols, start);
start++;
}
}
int main() {
vector<vector<int>> matrix = {{1,2,3},{4,5,6},{7,8,9}};
printMatrix(matrix);
return 0;
}
示例2
假设我们现在有一个4x5的矩阵,其元素如下:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
按照顺时针遍历的顺序输出应该为:
1 2 3 4 5 10 15 20 19 18 17 16 11 6 7 8 9 14 13 12
代码实现如下:
#include <iostream>
#include <vector>
using namespace std;
void printMatrixInCircle(vector<vector<int>> matrix, int rows, int cols, int start) {
int endX = cols - 1 - start;
int endY = rows - 1 - start;
// 从左向右遍历一行
for (int i = start; i <= endX; i++) {
cout << matrix[start][i] << " ";
}
// 从上向下遍历一列
if (start < endY) {
for (int i = start + 1; i <= endY; i++) {
cout << matrix[i][endX] << " ";
}
}
// 从右向左遍历一行
if (start < endX && start < endY) {
for (int i = endX - 1; i >= start; i--) {
cout << matrix[endY][i] << " ";
}
}
// 从下向上遍历一列
if (start < endX && start < endY - 1) {
for (int i = endY - 1; i >= start + 1; i--) {
cout << matrix[i][start] << " ";
}
}
}
void printMatrix(vector<vector<int>> matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
int start = 0;
while (rows > start * 2 && cols > start * 2) {
printMatrixInCircle(matrix, rows, cols, start);
start++;
}
}
int main() {
vector<vector<int>> matrix = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};
printMatrix(matrix);
return 0;
}
以上就是本次的完整攻略,希望能对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现:螺旋矩阵的实例代码 - Python技术站