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

C++实现魔法矩阵攻击上方区域修改(P3650防御魔法护盾)

我来帮你解决这道 **P3650防御魔法护盾** 题目。题目要求将攻击点上方的三个位置(左上方、正上方、右上方)的字符改为 `'0'`。 --- ## 🧠 问题分析 - 矩阵大小:`n×m` - 攻击位置 `(x, y)`:**1-based**(从1开始) - 需要修改的三个位置(相对于攻击点): - 左上方:`(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; // 上方三个位置:左上、正上、右上 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++) { for (int j = 0; j < m; j++) { cout << matrix[i][j]; if (j < m - 1) { cout << " "; } } cout << endl; } return 0; } ``` --- ## 🔍 关键代码解释 - **`vector<vector<char>>`**:使用二维字符向量存储矩阵 - **坐标转换**:`px = x - 1; py = y - 1;` 将1-based输入转为0-based - **方向数组**: - `dx[] = {-1, -1, -1}` 表示行全部向上移动一行 - `dy[] = {-1, 0, 1}` 分别对应左、中、右三列 - **边界检查**:确保 `nx` 和 `ny` 在矩阵范围内 - **输出格式**:每个字符之间有空格,行末无多余空格 --- ## 📊 示例验证 **输入:** ``` 4 5 a b c d e f g h i j k l m n o p q r s t 3 3 ``` **运行过程:** - 攻击点 `(3,3)` → 0-based:`(2,2)` - 上方三个位置: - 左上:`(1,1)` → 'g' → 改为 '0' - 正上:`(1,2)` → 'h' → 改为 '0' - 右上:`(1,3)` → 'i' → 改为 '0' **输出:** ``` a b c d e f 0 0 0 j k l m n o p q r s t ``` --- ## ⚠️ 边界情况处理 | 情况 | 处理方式 | |------|----------| | 攻击点在第1行(x=1) | 上方无位置,不做任何修改 | | 攻击点在最左列(y=1) | 左上方超出边界,只修改正上和右上 | | 攻击点在最右列(y=m) | 右上方超出边界,只修改左上和正上 | | 攻击点在角落(如(1,1)) | 三个位置均不存在,矩阵不变 | --- ## 💡 开发建议 1. **注意输入格式**:题目中提到每个字符之间有空格,所以要用 `cin` 逐个读取字符 2. **使用方向数组**:通过 `dx[]` 和 `dy[]` 可以灵活处理多个方向的位置 3. **边界检查必须完整**:行和列都要检查,防止越界访问 4. **输出格式要精确**:字符之间必须有空格,行末不能有额外空格 --- ## 📚 时间复杂度分析 - 时间复杂度:**O(n×m)**,主要消耗在读入和输出矩阵 - 空间复杂度:**O(n×m)**,存储矩阵本身 本题数据范围很小(≤100),这种复杂度完全足够。 ######[AI写代码神器 | 1210点数解答 | 2026-08-27 16:55:10]

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