C/C++ 实现蛇形矩阵的示例代码
蛇形矩阵(或称螺旋矩阵)是经典的算法模拟题。解决该问题的核心在于将顺时针旋转的方向变化抽象为数学模型,利用二维数组记录坐标并处理边界条件。本文将详细解析思路并提供 C 与 C++ 的完整实现代码。
题目描述
给定一个不大于 9 的正整数 n,要求输出一个 n×n 的蛇形方阵。数字从左上角开始按 1 递增,按照顺时针方向(右 → 下 → 左 → 上)依次填入。注意:每个数字占用 3 个字符宽度,不足时左侧补空格。
输入样例:
4
输出样例:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
解题思路
第1步:建立方向映射模型
蛇形矩阵的运动轨迹具有周期性,遵循“右、下、左、上”四个方向的循环。我们可以定义一个二维数组来存储这四个方向在行(x)和列(y)上的偏移量。通常设定索引顺序对应上述循环:
- 方向 0:右 ({0, 1})
- 方向 1:下 ({1, 0})
- 方向 2:左 ({0, -1})
- 方向 3:上 ({-1, 0})
通过维护一个当前方向索引 d,即可快速计算下一步的相对位移。
第2步:坐标移动与状态更新
使用二维数组 map[n+1][n+1] 存储生成的矩阵。初始化起点坐标 (x=1, y=1),当前方向 d=0。在每次循环中:
- 将当前序号 i 填入
map[x][y]。 - 计算临时下一步坐标
tx = x + pos[d][0],ty = y + pos[d][1]。 - 判断是否需要转向:若
tx或ty超出边界(即不在[1, n]范围内),或者map[tx][ty]已被填充(值大于 0),则改变方向d = (d + 1) % 4。 - 根据新的方向更新实际坐标
(x, y)。
第3步:格式化输出
填充完成后,遍历二维数组进行打印。为了满足题目要求的每个数字占 3 个字符,可使用格式字符串 %3d 自动补齐空格。
完整代码实现
C 语言版
注意:变量 map 定义在全局区,会自动初始化为 0,便于后续判断是否访问过。
#include<stdio.h>
// 全局变量默认初始化为0,空间开大避免越界
int map_arr[15][15];
// 方向数组:右、下、左、上
int pos[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int main()
{
int n;
scanf("%d", &n);
int x = 1, y = 1, d = 0; // 初始位置(1,1),方向0(右)
// 填充 1 到 n*n
for(int i = 1; i <= n * n; i++)
{
map_arr[x][y] = i;
// 试探下一步坐标
int tx = x + pos[d][0];
int ty = y + pos[d][1];
// 判断是否越界或遇到已填充格子
if(tx > n || ty > n || tx < 1 || ty < 1 || map_arr[tx][ty] > 0)
{
d = (d + 1) % 4; // 改变方向
}
// 移动至新坐标
x += pos[d][0];
y += pos[d][1];
}
// 输出结果
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
printf("%3d", map_arr[i][j]);
}
printf("\n");
}
return 0;
}
C++ 版
在 C++ 中,由于标准库中存在名为 std::map 的容器,局部变量直接命名为 map 可能导致编译歧义,建议重命名或使用 using namespace std; 时注意区分。此处改用 map2 避免冲突。
#include<iostream>
#include<cstdio>
using namespace std;
int map2[15][15]; // 避免与 std::map 冲突
int pos[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int main()
{
int n;
cin >> n;
int x = 1, y = 1, d = 0;
for(int i = 1; i <= n * n; i++)
{
map2[x][y] = i;
int tx = x + pos[d][0];
int ty = y + pos[d][1];
// 边界检查与填充检查
if(tx > n || ty > n || tx < 1 || ty < 1 || map2[tx][ty])
{
d = (d + 1) % 4;
}
x += pos[d][0];
y += pos[d][1];
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
printf("%3d", map2[i][j]);
}
cout << endl;
}
return 0;
}
以上即为 C/C++ 实现蛇形矩阵的详细内容,更多关于 C/C++ 算法模拟的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













