酷代码 AI
菜单
服务商
DeepSeek字节豆包
更多选项

三道C++算法题完整解析:防御魔法护盾、绝对值之和与奇数排序

我来帮你完成这三道题目,分别给出完整代码和解析。 --- # 📘 P3650 防御魔法护盾 ## 🧠 问题分析 - **n×m 字符矩阵**,攻击位置 `(x, y)` 为 **1-based** 坐标 - 需要修改**三个上方位置**(若存在)为 `'0'`: - 左上方:`(x-1, y-1)` - 正上方:`(x-1, y)` - 右上方:`(x-1, y+1)` - 特别注意: - 若攻击点在第 1 行,则上方无位置,无需修改 - 若攻击点在最左/最右列,需检查列边界 ## 💻 完整C++代码 ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n, m; cin >> n >> m; // 读取矩阵(注意字符间有空格) vector<vector<char>> matrix(n, vector<char>(m)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> matrix[i][j]; } } int x, y; cin >> x >> y; // 转为0-based索引 int px = x - 1; int py = y - 1; // 判断攻击点是否在第1行 if (px > 0) { int up = px - 1; // 左上方(如果存在) if (py - 1 >= 0) { matrix[up][py - 1] = '0'; } // 正上方(一定存在,因为py在合法范围内) matrix[up][py] = '0'; // 右上方(如果存在) if (py + 1 < m) { matrix[up][py + 1] = '0'; } } // 输出结果 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cout << matrix[i][j]; if (j < m - 1) cout << " "; } cout << endl; } return 0; } ``` ## 🔍 关键点说明 - **坐标转换**:输入是 1-based,必须转为 0-based 才能正确访问数组 - **边界检查**: - 攻击点在第 1 行(`px == 0`)时,直接跳过 - 左上方需要 `py - 1 >= 0` - 右上方需要 `py + 1 < m` - **输入/输出格式**:字符间有空格,行末无多余空格 --- # 📗 P3688 绝对值之和 ## 🧠 问题分析 - 输入 `n` 个整数,对每个数取绝对值后求和 - 约束:`n ≤ 1000`,数值在 int 范围内 ## 💻 完整C++代码 ```cpp #include <iostream> #include <cstdlib> // 包含 abs() 函数 using namespace std; int main() { int n; cin >> n; int sum = 0; for (int i = 0; i < n; i++) { int num; cin >> num; sum += abs(num); // 累加绝对值 } cout << sum << endl; return 0; } ``` ## 🔍 关键点说明 - `abs()` 函数用于计算整数的绝对值,定义在 `<cstdlib>` 头文件中 - 时间复杂度 **O(n)**,空间复杂度 **O(1)**(只用一个累加变量) - 累积到 `int` 类型即可,因为 `n ≤ 1000`,且没有超出 int 范围 --- # 📙 P3687 奇数的顺序 ## 🧠 问题分析 - 输入 `n` 个正整数,找出其中**所有奇数** - 将这些奇数**从大到小排序**输出 - 约束:`n ≤ 1000` ## 💻 完整C++代码 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin >> n; vector<int> oddNumbers; for (int i = 0; i < n; i++) { int num; cin >> num; if (num % 2 != 0) { // 判断奇数 oddNumbers.push_back(num); } } // 从大到小排序 sort(oddNumbers.begin(), oddNumbers.end(), greater<int>()); // 输出结果 for (int i = 0; i < oddNumbers.size(); i++) { cout << oddNumbers[i]; if (i < oddNumbers.size() - 1) cout << " "; } cout << endl; return 0; } ``` ## 🔍 关键点说明 - **奇数判断**:`num % 2 != 0`(注意负数情况,但题目保证是正整数) - **排序**:使用 `sort()` 函数,配合 `greater<int>()` 实现**降序排列**(从大到小) - **输出格式**:数字之间用空格分隔,行末换行 --- ## 📊 时间与空间复杂度对比 | 题目 | 时间复杂度 | 空间复杂度 | |------|------------|------------| | P3650 防御魔法护盾 | O(n×m) | O(n×m) | | P3688 绝对值之和 | O(n) | O(1) | | P3687 奇数的顺序 | O(n log n) | O(n) | --- ## 💡 开发建议 1. **P3650**:建议使用 `vector<vector<char>>` 存储字符矩阵,方便动态访问;注意输入格式中有空格,必须用 `cin` 逐个读取字符 2. **P3688**:`abs()` 是最直接的方式,不要自己写绝对值逻辑,容易出错 3. **P3687**:先收集奇数再排序,比边输入边排序更清晰;`greater<int>()` 是降序排列的标准写法 4. **通用建议**: - 所有题目都注意**输出格式**(空格、换行) - 使用 `cin` 和 `cout` 时,可以加上 `ios::sync_with_stdio(false)` 和 `cin.tie(0)` 提高 IO 速度 --- ######[AI写代码神器 | 1500点数解答 | 2026-08-27 17:45:13]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]