小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 作为辅助工具,并结合自身的努力,才能取得更好的学习效果。