C++实现P3650防御魔法护盾:矩阵字符修改与边界处理详解
根据题目描述,这是一个**二维矩阵字符修改**问题。我们需要将攻击位置 `(x, y)` 上方的三个位置(左上方、正上方、右上方)的字符改为 `'0'`。 我将用 **C++** 给出完整解法,并进行详细解释。 --- ## 🧠 问题分析 - 矩阵大小:`n` 行 `m` 列(1 ≤ n, m ≤ 100) - 攻击位置:`(x, y)`,注意输入是 **1-based**(从1开始),需要在代码中转为 **0-based**(从0开始) - 需修改的三个位置(相对于攻击点): - 左上方:`(x-2, y-2)` (因为1-based转0-based后,原x-1对应新x'-1,即 x'-1) - 正上方:`(x-2, y-1)` (即新索引的 x'-1, y') - 右上方:`(x-2, y)` (即新索引的 x'-1, y'+1) - 需要注意边界,确保坐标在矩阵范围内。 **关键点**:在0-based索引下,攻击点为 `(px, py)` = `(x-1, y-1)`,上方三位置为: - `(px-1, py-1)` —— 左上 - `(px-1, py)` —— 正上 - `(px-1, py+1)` —— 右上 只有当 `px-1 >= 0` 且列在 `[0, m-1]` 内时才修改。 --- ## 💻 完整C++代码实现 ```cpp #include <iostream> #include <vector> #include <string> using namespace std; int main() { int n, m; cin >> n >> m; // 读入行列数 // 读入矩阵 vector<string> matrix(n); for (int i = 0; i < n; i++) { cin >> matrix[i]; } int x, y; cin >> x >> y; // 攻击位置(1-based) // 转为0-based下标 int px = x - 1; int py = y - 1; // 定义三个候选位置:左上、正上、右上 int dx[] = {-1, -1, -1}; int dy[] = {-1, 0, 1}; // 遍历三个方向 for (int i = 0; i < 3; i++) { int nx = px + dx[i]; int ny = py + dy[i]; // 检查是否在矩阵范围内 if (nx >= 0 && nx < n && ny >= 0 && ny < m) { matrix[nx][ny] = '0'; // 修改字符 } } // 输出结果 for (int i = 0; i < n; i++) { cout << matrix[i] << endl; } return 0; } ``` --- ## 🔍 关键代码解释 - **`vector<string> matrix(n)`**:创建一个包含 `n` 个字符串的向量,每个字符串代表一行。 - **`cin >> matrix[i]`**:直接读入字符串作为一行字符。 - **坐标转换**:`px = x - 1; py = y - 1;` 将1-based输入转为0-based索引。 - **方向数组**: - `dx[] = {-1, -1, -1}` 表示行方向都向上移动1行 - `dy[] = {-1, 0, 1}` 分别对应左、中、右三列 - **边界检查**:`nx >= 0 && nx < n && ny >= 0 && ny < m` 防止越界。 --- ## 📊 示例运行 **输入:** ``` 3 3 abc def ghi 2 2 ``` **运行过程:** - 攻击点 `(2,2)` → 转为0-based:`(1,1)` - 三个候选位置: - 左上:`(0,0)` → 字符 'a' → 改为 '0' - 正上:`(0,1)` → 字符 'b' → 改为 '0' - 右上:`(0,2)` → 字符 'c' → 改为 '0' - 修改后第一行变为 `"000"`,其余不变 **输出:** ``` 000 def ghi ``` --- ## ⚠️ 边界情况处理 | 情况 | 处理方式 | |------|----------| | 攻击点在第一行(x=1) | 上方无位置,不做修改 | | 攻击点在最左列(y=1) | 左上方超出边界,只修改正上和右上 | | 攻击点在最右列(y=m) | 右上方超出边界,只修改左上和正上 | | 攻击点在角落(如(1,1)) | 三个位置均不存在,矩阵不变 | --- ## 💡 开发建议与最佳实践 1. **使用方向数组**:通过 `dx[]` 和 `dy[]` 数组可以轻松管理多个相对位置,代码更简洁、易于维护。 2. **注意1-based和0-based转换**:这是本题最容易出错的地方,务必在输入后立即转换。 3. **输出格式**:每行直接输出字符串即可,不需要额外空格。 4. **如果数据量大**:可以用 `ios::sync_with_stdio(false)` 和 `cin.tie(nullptr)` 加速输入输出(本题数据小,非必需)。 5. **扩展性**:如果要修改更多方向(如上下左右等),只需扩展方向数组即可。 --- ## 📚 相关知识点 - **二维数组/矩阵遍历** - **字符串处理**(`std::string`) - **边界条件判断** - **坐标转换**(1-based ↔ 0-based) ######[AI写代码神器 | 1355点数解答 | 2026-08-27 16:53:44]
- C++实现读取数字并输出最小值的代码及解释(字节豆包 | 113点数解答 | 2026-03-20 19:32:56)112
- C++ 实现:轻松计算两个矩阵的乘法并输出结果(字节豆包 | 381点数解答 | 2025-12-03 19:20:23)265
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)569
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)356
- C语言:按特定格式输入并格式化输出整数、实数和字符(字节豆包 | 103点数解答 | 2024-10-24 11:12:53)516
- Python 实现按指定字符位置逆序字符串,处理多种边界情况!(字节豆包 | 197点数解答 | 2024-11-22 16:55:09)409
- C++实现n×n图案输出:中间行'#'其余'*',开发需注意三点!(字节豆包 | 265点数解答 | 2026-01-16 19:06:25)141
- Python破解NOIP2015基础扫雷游戏:计算非地雷格周围地雷数(字节豆包 | 545点数解答 | 2026-02-02 17:34:02)146
- C++实现输出指定奇数阶中间行带#的矩形图案(字节豆包 | 267点数解答 | 2026-02-14 19:34:03)110
- C++实现输出指定奇数阶中间为#其余为*的方阵(字节豆包 | 385点数解答 | 2026-02-25 16:20:13)114
- C++实现奇数阶矩阵中间行特殊字符输出(DeepSeek | 261点数解答 | 2026-02-28 10:55:53)113
- C++实现特定图案输出及开发建议(字节豆包 | 628点数解答 | 2026-03-06 18:58:46)94