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

魔法矩阵护盾模拟与绝对值求和C++实现

好的!我来为你分别解答这两道题目,并给出完整的 C++ 代码实现。 --- # 📘 第一题:P3650 防御魔法护盾 ## 🧠 问题分析 - 矩阵大小为 `n × m` - 攻击位置 `(x, y)` 是 **1-based** 坐标 - 需要修改三个位置: - 左上方:`(x-1, y-1)` - 正上方:`(x-1, y)` - 右上方:`(x-1, y+1)` - 如果该位置存在(即行号 ≥ 1,列号在 1~m 范围内),则将其改为 `'0'` - 注意攻击点如果在第 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; // 上方三个位置:左上、正上、右上 // 行坐标为 px-1,列坐标分别为 py-1, py, py+1 int dx = px - 1; if (dx >= 0) { // 左上方 if (py - 1 >= 0) { matrix[dx][py - 1] = '0'; } // 正上方 matrix[dx][py] = '0'; // 右上方 if (py + 1 < m) { matrix[dx][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行时,`dx = px - 1 < 0`,直接跳过整个操作 - 左上方:需要检查 `py - 1 >= 0` - 右上方:需要检查 `py + 1 < m` - **输出格式**:要注意题目要求**每个字符之间有空格**,行末不能有多余空格 --- # 📗 第二题:P3688 绝对值之和 ## 🧠 问题分析 - 输入 `n` 个整数 - 对每个整数取绝对值,然后求和 - 数据范围:`n ≤ 1000` ## 💻 完整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>` 头文件中 - 逐个读入数字,累加绝对值即可 - 输出结果后换行 --- ## 💡 开发建议 1. **第一题注意输入格式**:字符之间有空格,必须逐个读取字符 2. **第一题注意输出格式**:字符之间有空格,行末无多余空格 3. **第二题**:`abs()` 对 `int` 类型有效,也可以使用 `<cmath>` 中的 `fabs()`,但 `abs()` 更适合整数 4. **边界情况**:第一题务必处理攻击位置在第1行、第1列、第m列的情况 --- ######[AI写代码神器 | 1007点数解答 | 2026-08-27 16:59:01]

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