C++ 实现回形矩阵打印算法 - 详细代码解析
C++ 实现回形矩阵打印算法 - 详细代码解析
题目描述:
输入一个正整数 n,试打印输出 n*n 的回形矩阵(每个元素占 4 位场宽)。
输入:
一行,一个整数 n (1 ≤ n ≤ 20)。
输出:
一个 n 行 n 列的回形矩阵。
样例组
样例输入 1:
6
样例输出 1:
1 1 1 1 1 1
1 2 2 2 2 1
1 2 3 3 2 1
1 2 3 3 2 1
1 2 2 2 2 1
1 1 1 1 1 1
C++ 代码:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n;
cin >> n;
int matrix[n][n];
int startRow = 0, endRow = n-1, startCol = 0, endCol = n-1;
int num = 1;
while (startRow <= endRow && startCol <= endCol) {
for (int i = startCol; i <= endCol; i++) {
matrix[startRow][i] = num;
num++;
}
startRow++;
for (int i = startRow; i <= endRow; i++) {
matrix[i][endCol] = num;
num++;
}
endCol--;
for (int i = endCol; i >= startCol; i--) {
matrix[endRow][i] = num;
num++;
}
endRow--;
for (int i = endRow; i >= startRow; i--) {
matrix[i][startCol] = num;
num++;
}
startCol++;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << setw(4) << matrix[i][j];
}
cout << endl;
}
return 0;
}
代码解析:
-
初始化:
- 声明一个二维数组
matrix,大小为n*n,用于存储回形矩阵元素。 - 初始化四个变量
startRow、endRow、startCol、endCol,分别代表矩阵的起始行、结束行、起始列、结束列。 - 初始化变量
num为 1,用于填充矩阵元素的值。
- 声明一个二维数组
-
循环遍历:
- 使用
while循环,循环条件为startRow <= endRow且startCol <= endCol,即当起始行小于等于结束行,且起始列小于等于结束列时,继续循环遍历。 - 在每次循环中,按照以下步骤填充矩阵元素:
- 从左到右填充一行:
for (int i = startCol; i <= endCol; i++) - 从上到下填充一列:
for (int i = startRow; i <= endRow; i++) - 从右到左填充一行:
for (int i = endCol; i >= startCol; i--) - 从下到上填充一列:
for (int i = endRow; i >= startRow; i--)
- 从左到右填充一行:
- 每填充完一圈,更新起始行、结束行、起始列、结束列的值,使下一圈填充从新的位置开始。
- 使用
-
打印矩阵:
- 使用嵌套
for循环,遍历matrix数组,并将每个元素以 4 位场宽打印输出。
- 使用嵌套
总结:
该 C++ 代码实现了回形矩阵打印算法,通过控制循环遍历的顺序和起始位置,能够按照回形顺序填充矩阵元素。
练习:
尝试修改代码,实现以下功能:
- 改变矩阵的填充顺序,例如从右上角开始填充。
- 控制矩阵元素的值,例如按照递增的平方数填充。
- 将回形矩阵打印成螺旋形矩阵。
提示:
- 在修改代码时,注意更新起始位置和填充顺序。
- 可以使用
setw()函数控制输出的场宽。 - 可以参考螺旋矩阵的填充方式,进行代码修改。
希望这篇文章能够帮助您理解回形矩阵打印算法的实现过程。
原文地址: https://www.cveoy.top/t/topic/pZMy 著作权归作者所有。请勿转载和采集!