第六届字节跳动青训营第五课 | 豆包MarsCode AI 刷题

85 阅读5分钟

蛇形填充n阶方阵

题目地址: www.marscode.cn/practice/dn…

代码思路

  1. 初始化矩阵:创建一个n×n的二维向量(或数组),并将其所有元素初始化为0。

  2. 确定起始点和移动方向:通常情况下,我们从最上面一行的最后一个元素开始,即(0,n−1)(0,n−1),然后选择一个初始方向,比如向左下方移动。

  3. 填充过程

    • 从1开始,逐个增加数字,直到n*n。
    • 在每次放置数字后,检查下一个位置的合法性(即在矩阵范围内且未被占用)。
    • 如果下一个位置不合法,则顺时针旋转90度改变方向,并再次尝试放置数字。
    • 继续这个过程,直到所有的数字都被放置在矩阵中。
  4. 输出结果:以特定的格式输出填充好的矩阵,确保每行之间有空格分隔,每个数字后面跟着逗号和空格,除了最后一列的最后一个数字。

完整代码

#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社区,可以交流学习经验,获取最新信息。