蛇形填充n阶方阵
题目地址: www.marscode.cn/practice/dn…
代码思路
-
初始化矩阵:创建一个n×n的二维向量(或数组),并将其所有元素初始化为0。
-
确定起始点和移动方向:通常情况下,我们从最上面一行的最后一个元素开始,即(0,n−1)(0,n−1),然后选择一个初始方向,比如向左下方移动。
-
填充过程:
- 从1开始,逐个增加数字,直到n*n。
- 在每次放置数字后,检查下一个位置的合法性(即在矩阵范围内且未被占用)。
- 如果下一个位置不合法,则顺时针旋转90度改变方向,并再次尝试放置数字。
- 继续这个过程,直到所有的数字都被放置在矩阵中。
-
输出结果:以特定的格式输出填充好的矩阵,确保每行之间有空格分隔,每个数字后面跟着逗号和空格,除了最后一列的最后一个数字。
完整代码
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> solution(int n) {
// 初始化 n x n 的矩阵
vector<vector<int>> matrix(n, vector<int>(n, 0));
// 定义四个方向:右、下、左、上
vector<pair<int, int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
// 初始置和方向
int x = 0, y = n - 1, dir = 0;
// 填充数字
for (int num = 1; num <= n * n; ++num) {
matrix[x][y] = num;
// 计算下一个位置
int nextX = x + directions[dir].first;
int nextY = y + directions[dir].second;
// 检查是否需要改变方向
if (nextX < 0 || nextX >= n || nextY < 0 || nextY >= n || matrix[nextX][nextY] != 0) {
dir = (dir + 1) % 4; // 改变方向
nextX = x + directions[dir].first;
nextY = y + directions[dir].second;
}
// 更新当前位置
x = nextX;
y = nextY;
}
return matrix;
}
//main函数进行solution函数测试
int main() {
vector<vector<int>> a1 = solution(4);
cout << (a1 == vector<vector<int>>{{10, 11, 12, 1}, {9, 16, 13, 2}, {8, 15, 14, 3}, {7, 6, 5, 4}}) << endl;
vector<vector<int>> a2 = solution(5);
cout << (a2 == vector<vector<int>>{{13, 14, 15, 16, 1}, {12, 23, 24, 17, 2}, {11, 22, 25, 18, 3}, {10, 21, 20, 19, 4}, {9, 8, 7, 6, 5}}) << endl;
vector<vector<int>> a3 = solution(3);
cout << (a3 == vector<vector<int>>{{7, 8, 1}, {6, 9, 2}, {5, 4, 3}}) << endl;
return 0;
}
知识点总结
- 类和对象的基本概念和使用(包括类的定义、成员变量的初始化等)。
- 运算符重载,如[ ]运算符的重载,用于访问数组元素。
- 使用引用传递参数,例如在函数
generateMatrix中使用int& operator[](int index)来返回对内部数组的引用。 - 使用迭代器遍历容器,例如在
for(auto it = matrix.begin(); it != matrix.end(); ++it)中使用的auto关键字和begin/end函数。
学习计划
第一阶段:C++基础知识入门
-
目标:掌握C++的基本语法、程序结构和简单的输入输出操作。
-
内容:
- C++基础语法(变量、数据类型、运算符、控制结构)
- 函数的定义与调用
- 输入输出流(iostream库)
- 基本的文件操作
-
时间:3周
-
实践项目:编写简单的C++程序,如计算器、数据排序等。
第二阶段:C++进阶知识
-
目标:深入学习C++的高级特性,包括面向对象编程、STL标准库等。
-
内容:
- 面向对象编程(类、对象、继承、多态)
- 指针与引用
- 动态内存管理(new/delete)
- 异常处理
- STL标准库(vector、map、set等)
-
时间:4周
-
实践项目:实现一个小型的游戏或应用程序,如贪吃蛇、图书管理系统。
第三阶段:C++算法与数据结构
-
目标:掌握C++中的常用算法和数据结构,提高解决问题的能力。
-
内容:
- 线性数据结构(数组、链表、栈、队列)
- 非线性数据结构(树、图)
- 排序与搜索算法(冒泡排序、快速排序、二分查找等)
- 算法设计技巧(递归、动态规划)
-
时间:5周
-
实践项目:解决算法题库中的问题,如LeetCode、Codeforces等。
第四阶段:C++项目实践
-
目标:通过实际项目来综合运用所学知识,提升编程技能。
-
内容:
- 项目需求分析
- 设计和实现项目
- 代码调试与优化
- 编写项目文档
-
时间:6周
-
实践项目:开发一个中型项目,如网络聊天室、简单的数据库应用。
工具应用
1. Marscode在线AI
- Marscode:功能十分强大的在线AI工具,能够在做题过程中发现自己的code问题,并给出一定可行的建议,Marscode附属在掘金刷题网站上,使用方便,简单高效,本人强烈推荐。
2. 集成开发环境(IDE)
- Visual Studio:功能强大的IDE,支持C++开发,提供丰富的调试工具和代码补全功能。
- CLion:专为C++设计的IDE,具有代码分析、智能代码补全、代码格式化等功能。
3. 编译器
- GCC:GNU编译器集合,用于编译C++代码,是C++开发中常用的编译器。
4. 调试工具
- GDB:GNU调试器,用于C++程序的调试,能够帮助开发者找到并修复代码中的错误。
5. 版本控制系统
- Git:代码版本控制系统,用于代码的备份、共享和协作,是现代软件开发的重要组成部分。
6. 代码分析工具
- Valgrind:用于内存调试、内存泄露检测以及性能分析。
- cppcheck:静态代码分析工具,用于检查C++代码中的错误。
7. 在线编程平台
- LeetCode:提供大量编程题目,用于练习算法和数据结构。
- Codeforces:在线编程竞赛平台,可以提升算法竞赛能力。
8. 学习资源
- C++参考手册:查阅C++标准库和语言特性。
- C++ Primer:经典C++入门书籍,适合初学者和进阶者。
- Stack Overflow:编程问题解答社区,用于解决编程中遇到的问题。
9. 社区与论坛
- C++社区:如C++论坛、Reddit上的r/cpp社区,可以交流学习经验,获取最新信息。