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

C++实现魔法矩阵攻击模拟算法及边界处理详解

## 🧙 模拟攻击对魔法矩阵的影响(C++ 实现) 根据题目要求,给定一个 `n*m` 的字符矩阵和一个攻击位置 `(x,y)`,需要将攻击点上方的三个位置(左上方、正上方、右上方)的字符改为 `'0'`。注意:只有存在的位置才修改(即不越界)。 ### 📝 解题思路 - 攻击点的坐标为 `(x,y)`,对应矩阵中的行索引为 `x-1`,列索引为 `y-1`(因为输入从1开始)。 - 需要检查的三个位置是: - 左上方:`(x-2, y-2)`(行减2,列减1) - 正上方:`(x-2, y-1)`(行减2,列不变) - 右上方:`(x-2, y)`(行减2,列加1) - 只要行和列在 `[0, n-1]` 和 `[0, m-1]` 范围内,就将对应字符改为 `'0'`。 - 输出修改后的矩阵,每行元素用空格分隔。 ### 💻 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 attack_row = x - 1; int attack_col = y - 1; // 检查三个上方位置 // 左上方 int row1 = attack_row - 1, col1 = attack_col - 1; if (row1 >= 0 && row1 < n && col1 >= 0 && col1 < m) { matrix[row1][col1] = '0'; } // 正上方 int row2 = attack_row - 1, col2 = attack_col; if (row2 >= 0 && row2 < n && col2 >= 0 && col2 < m) { matrix[row2][col2] = '0'; } // 右上方 int row3 = attack_row - 1, col3 = attack_col + 1; if (row3 >= 0 && row3 < n && col3 >= 0 && col3 < m) { matrix[row3][col3] = '0'; } // 输出结果 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (j > 0) cout << " "; cout << matrix[i][j]; } cout << endl; } return 0; } ``` ### 🔍 示例验证 输入: ``` 3 3 A B C D E F G H I 2 2 ``` 攻击位置为 (2,2),即矩阵中的 `E`。上方三个位置为: - 左上方:`A` → `0` - 正上方:`B` → `0` - 右上方:`C` → `0` 输出: ``` 0 0 0 D E F G H I ``` ### ⚠️ 边界情况处理 - 当攻击在第一行时,上方无位置,不修改任何字符。 - 当攻击在边界列时,只修改存在的位置,例如 `(2,1)` 只修改正上方和右上方。 - 矩阵字符保证为英文字母,但修改后可能出现数字 `'0'`,不影响后续处理。 ### 🚀 复杂度分析 - 时间复杂度:O(n*m),遍历一次矩阵进行修改和输出。 - 空间复杂度:O(n*m),用于存储矩阵。 ######[AI问答 | 915点数解答 | 2026-08-21 19:57:48]

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