三道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]
- 使用位运算对黄金城原材料编号进行奇偶分类的C++程序(字节豆包 | 211点数解答 | 2026-02-28 20:38:57)116
- C++ 使用位运算判断材料编号奇偶性及代码修正(字节豆包 | 618点数解答 | 2026-07-25 20:29:18)36
- C++位运算判断整数奇偶性:原理、实现与最佳实践(DeepSeek | 791点数解答 | 2026-07-23 16:18:22)45
- 超详细!整数奇偶与倍数判断代码解析及补全(字节豆包 | 462点数解答 | 2026-01-08 12:43:56)132
- 整数奇偶性及倍数判断代码实现(字节豆包 | 405点数解答 | 2026-04-25 19:08:03)87
- C++ 实现我的世界基岩版:从简单框架到开发要点揭秘(字节豆包 | 182点数解答 | 2025-02-22 15:53:11)296
- C++ 实现完整斗地主:含洗牌、发牌与手牌展示,可按需扩展!(字节豆包 | 1028点数解答 | 2026-01-10 08:02:37)141
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)405
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)431
- C语言实现:求a+aa+aaa+...+aa...a(n个a)之和的代码解析(GPT | 214点数解答 | 2024-11-13 16:07:25)223
- Python 代码实现:验证哥德巴赫猜想,严格校验输入求偶数质数分解(字节豆包 | 405点数解答 | 2024-11-27 21:54:51)231
- Python 实现:验证哥德巴赫猜想,输出偶数素数分解最小解(字节豆包 | 244点数解答 | 2024-11-27 21:55:19)244