小s的黑白块迷宫 &小u的奖学金申请问题的AI刷题记录| 豆包MarsCode AI刷题

82 阅读4分钟

小s的黑白块迷宫

  • 结构体 Node: 用于存储每个节点的状态,包括坐标 x 和 y,以及经过的黑色格子数 step。这使得代码更加清晰易懂,便于管理节点的状态。
  • vis 数组: 用于记录到达每个节点的最少黑色格子数,避免重复遍历同一个节点,提高算法效率。
  • 队列 q: 用于存储待遍历的节点,实现 BFS 算法。
  • dx 和 dy 数组: 表示四个方向的移动,简化了方向控制逻辑。

小u的奖学金申请问题

  • 循环遍历: 使用循环遍历成绩数组 b 和 a,计算加权成绩总和和学分总和。
  • 条件判断: 使用条件判断语句判断是否有不及格的课程,以及加权平均分是否达到标准。
  • 类型转换: 使用 static_cast<double> 将加权成绩总和转换为 double 类型,保证计算结果的精度。

代码改进

小s的黑白块迷宫

  • 优化 vis 数组: 可以使用二维数组,将每个节点的最少黑色格子数与坐标直接关联,进一步提高代码可读性。
  • 避免重复入队: 可以使用 set 或 map 数据结构,存储已经遍历过的节点,避免重复入队。

代码

#include <vector>
#include <string>
using namespace std;

int dx[] = { 0, 0, 1, -1 };  // 方向数组,表示向上下左右移动
int dy[] = { 1, -1, 0, 0 };
struct Node {
    int x, y, step;  // 当前节点的坐标与经过的黑色格子数
};

// 计算从起点到终点经过的最少黑色格子的数量
int solution(int n, int m, std::vector<std::vector<int>>& grid) {
    std::vector<std::vector<int>> vis(n, std::vector<int>(m, INT_MAX));  // 用于记录到达每个节点的最少黑色格子数
    queue<Node> q;

    // 初始化起点
    if (grid[0][0] == 1) {
        q.push({ 0, 0, 1 });
        vis[0][0] = 1;  // 起点是黑色格子
    }
    else {
        q.push({ 0, 0, 0 });
        vis[0][0] = 0;  // 起点是白色格子
    }

    while (!q.empty()) {
        Node cur = q.front();
        q.pop();

        // 遍历四个方向
        for (int i = 0; i < 4; i++) {
            int nx = cur.x + dx[i], ny = cur.y + dy[i], nstep = cur.step;

            // 检查边界
            if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;

            // 增加黑色格子数
            if (grid[nx][ny] == 1) nstep++;

            // 只有在nstep更小时更新vis,并继续遍历
            if (nstep < vis[nx][ny]) {
                vis[nx][ny] = nstep;
                q.push({ nx, ny, nstep });
            }
        }
    }

    // 如果终点不可达
    return vis[n - 1][m - 1] == INT_MAX ? -1 : vis[n - 1][m - 1];
}

int main() {
    std::vector<std::vector<int>> v1 = { {0, 1, 0}, {0, 1, 1}, {0, 1, 0}, {1, 0, 0}, {1, 0, 0} };
    std::vector<std::vector<int>> v2 = { {0, 0, 1, 0}, {1, 0, 1, 0}, {1, 0, 0, 0}, {1, 1, 1, 0} };
    std::vector<std::vector<int>> v3 = { {0, 0, 0}, {1, 1, 0}, {1, 1, 0} };

    std::cout << (solution(5, 3, v1) == 1) << std::endl;  // 输出:1
    std::cout << (solution(4, 4, v2) == 0) << std::endl;  // 输出:0
    std::cout << (solution(3, 3, v3) == 0) << std::endl;  // 输出:0

    return 0;
}

小u的奖学金申请问题

  • 使用 accumulate 函数: 可以使用 std::accumulate 函数计算加权成绩总和和学分总和,简化代码。
  • 优化类型转换: 可以使用 double 类型存储加权平均分,避免在计算过程中进行类型转换。

代码

#include <vector>

using namespace std;

bool solution(int n, int x, vector<int> a, vector<int> b) {
  // 检查所有成绩是否及格
  for (int grade : b) {
    if (grade < 60) {
      return false; // 如果有不及格的课程,直接返回false
    }
  }

  // 计算加权平均分
  int weightedSum = 0;  // 加权成绩总和
  int totalCredits = 0; // 学分总和
  for (int i = 0; i < n; i++) {
    weightedSum += a[i] * b[i]; // 加权成绩
    totalCredits += a[i];       // 总学分
  }

  // 计算加权平均分并与标准x比较
  // 使用浮点数比较以确保精度
  double weightedAverage = static_cast<double>(weightedSum) / totalCredits;
  return weightedAverage >= x;
}

int main() {
  cout << (solution(4, 75, {4, 3, 2, 1}, {80, 70, 90, 60}) == true) << endl;
  cout << (solution(3, 85, {3, 2, 5}, {90, 85, 88}) == true) << endl;
  cout << (solution(5, 80, {2, 2, 3, 1, 4}, {78, 80, 79, 85, 88}) == true)
       << endl;
  cout << (solution(6, 70, {4, 3, 2, 1, 2, 3}, {60, 72, 65, 90, 85, 95}) ==
           true)
       << endl;
  cout << (solution(4, 90, {2, 2, 2, 2}, {89, 91, 92, 85}) == false) << endl;
  return 0;
}

AI 刷题的优势

1. 快速学习: AI 可以通过深度学习等技术快速学习大量代码,并总结出不同题型的解题规律,从而提高解题效率。

2. 准确率高: AI 可以避免人为错误,例如语法错误、逻辑错误等,保证解题的准确性。

3. 个性化推荐: AI 可以根据学生的学习情况,推荐合适的题目和学习资源,帮助学生更有针对性地进行学习。

4. 自动化测试: AI 可以自动生成测试用例,并判断代码的正确性,帮助开发者及时发现和修复代码中的错误。

AI 刷题的局限性

1. 缺乏创造力: AI 主要依赖于已有的知识和数据,缺乏人类的创造力和想象力。

2. 无法理解问题: AI 无法像人类一样理解问题的背景和意义,只能根据输入输出进行判断。

3. 难以处理复杂问题: 对于一些复杂的问题,AI 的解题能力仍然有限。

总结

AI 刷题可以帮助我们快速学习和提高编程能力,但仍然需要人类的学习和创造力。我们应该将 AI 作为辅助工具,并结合自身的努力,才能取得更好的学习效果。