C/C++ 实现蛇形矩阵的示例代码

Miles
Miles
发布时间:2026-10-16 | 2人浏览过
原创

蛇形矩阵(或称螺旋矩阵)是经典的算法模拟题。解决该问题的核心在于将顺时针旋转的方向变化抽象为数学模型,利用二维数组记录坐标并处理边界条件。本文将详细解析思路并提供 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。在每次循环中:

  1. 将当前序号 i 填入 map[x][y]。
  2. 计算临时下一步坐标 tx = x + pos[d][0], ty = y + pos[d][1]。
  3. 判断是否需要转向:若 tx 或 ty 超出边界(即不在 [1, n] 范围内),或者 map[tx][ty] 已被填充(值大于 0),则改变方向 d = (d + 1) % 4。
  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++ 算法模拟的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表