一、引言
在编程中,螺旋矩阵 是一个经典的二维数组操作问题。它的核心思想是:按照顺时针或逆时针方向,依次将数字
1
到n²
填入一个n×n
的矩阵中。本篇文章将详细介绍如何用 C/C++ 编写程序实现螺旋矩阵填充 ,并介绍如何使用
printf
或setw()
进行对齐美观的格式化输出 。
二、螺旋矩阵填充原理
我们以 顺时针螺旋填充 为例:
- 从右上角开始(即位置
(0, n - 1)
); - 按照四个方向循环移动:
- 向下
- 向左
- 向上
- 向右
- 每次移动前检查是否越界或已经填过值;
- 当所有格子填满后停止。
三、完整代码实现(C++ 版)
#include <bits/stdc++.h>
using namespace std;
int main(){int n;cin >> n;int a[10][10];memset(a, 0, sizeof(a));int x = 0, y = n - 1;int cnt = 1;a[x][y] = cnt++;while (cnt <= n * n){// 向下走while (x + 1 < n && a[x + 1][y] == 0)a[++x][y] = cnt++;// 向左走while (y - 1 >= 0 && a[x][y - 1] == 0)a[x][--y] = cnt++;// 向上走while (x - 1 >= 0 && a[x - 1][y] == 0)a[--x][y] = cnt++;// 向右走while (y + 1 < n && a[x][y + 1] == 0)a[x][++y] = cnt++;}// 使用 printf 格式化输出for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){printf("%3d", a[i][j]);}printf("\n");}return 0;
}
四、格式化输出技巧
1. 使用 printf("%3d", a[i][j])
这是 C 语言中的格式化输出方式,%3d
表示输出至少占 3 个字符宽度,不足补空格,适合数字对齐。
示例输出(n = 4):
10 11 12 13
9 2 3 14
9 1 4 15
7 6 5 16
2. 使用 C++ 的 setw(3)
如果你更喜欢使用 C++ 风格的输出,可以使用 <iomanip>
中的 setw()
函数:
#include <iomanip>
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << setw(3) << a[i][j];
}
cout << endl;
}
五、常见问题与注意事项
问题 | 解决方案 |
---|---|
初始化错误导致数据被清空 |
|
死循环或漏填某些格子 | 控制每次移动的方向和边界条件 |
输出不整齐 | 使用 |