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 crossCount = 0; // 遍历矩阵中的每个元素 for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { // 检查当前元素是否为 '#' if (matrix[i][j] == '#') { // 检查上方元素 bool up = (i > 0) && (matrix[i - 1][j] == '#'); // 检查下方元素 bool down = (i < n - 1) && (matrix[i + 1][j] == '#'); // 检查左方元素 bool left = (j > 0) && (matrix[i][j - 1] == '#'); // 检查右方元素 bool right = (j < m - 1) && (matrix[i][j + 1] == '#'); // 如果四个方向的元素都为 '#',则构成十字图形 if (up && down && left && right) { crossCount++; } } } } // 输出十字图形的个数 cout << crossCount << endl; return 0; } ``` ### 📋代码解释 1. **输入处理**: - 首先读取矩阵的行数`n`和列数`m`。 - 然后使用二维向量`matrix`存储矩阵元素,通过嵌套的`for`循环逐行逐列读取矩阵元素。 2. **十字图形判断**: - 遍历矩阵中的每个元素,如果当前元素为`#`,则检查其上下左右四个相邻元素是否也为`#`。 - 通过布尔变量`up`、`down`、`left`和`right`分别表示四个方向的元素是否为`#`。 - 如果四个方向的元素都为`#`,则将十字图形的计数器`crossCount`加 1。 3. **输出结果**: - 最后输出`crossCount`,即十字图形的个数。 ### ⚙️开发建议 - **边界检查**:在检查上下左右元素时,需要注意边界条件,避免越界访问。代码中通过`i > 0`、`i < n - 1`、`j > 0`和`j < m - 1`进行边界检查。 - **代码模块化**:可以将十字图形的判断逻辑封装成一个独立的函数,提高代码的复用性和可读性。例如: ```cpp bool isCross(const vector<vector<char>>& matrix, int i, int j, int n, int m) { bool up = (i > 0) && (matrix[i - 1][j] == '#'); bool down = (i < n - 1) && (matrix[i + 1][j] == '#'); bool left = (j > 0) && (matrix[i][j - 1] == '#'); bool right = (j < m - 1) && (matrix[i][j + 1] == '#'); return up && down && left && right; } 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 crossCount = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (matrix[i][j] == '#' && isCross(matrix, i, j, n, m)) { crossCount++; } } } cout << crossCount << endl; return 0; } ``` - **错误处理**:可以增加对输入的合法性检查,例如检查`n`和`m`是否在`1 ≤ n, m ≤ 5`的范围内。 ### 📚学习资源 - [C++ 官方文档](https://en.cppreference.com/w/):提供了 C++ 语言的详细文档和教程。 - 《C++ Primer Plus》:经典的 C++ 学习书籍,适合初学者系统学习 C++ 语言。 ######[AI写代码神器 | 1226点数解答 | 2026-08-08 15:22:21]
- C++ 实现:轻松计算两个矩阵的乘法并输出结果(字节豆包 | 381点数解答 | 2025-12-03 19:20:23)254
- 揭秘!十进制整数转其他进制用啥存储结构最合适?答案竟是它!(字节豆包 | 57点数解答 | 2024-11-13 01:21:11)324
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)560
- C++实现滑动窗口最大值问题及开发建议(字节豆包 | 946点数解答 | 2026-08-15 16:07:43)4
- 使用C++解决滑动窗口最大值查找问题的实现与优化(字节豆包 | 555点数解答 | 2026-08-15 16:08:05)4
- C++实现滑动窗口最大值输出的解决方案及开发建议(字节豆包 | 718点数解答 | 2026-08-15 16:10:19)4
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)474
- C++ 实现游戏赢家判断:巧妙找出满足和条件的最大数 (DeepSeek | 506点数解答 | 2025-06-20 16:18:09)185
- C++ 实现根据部分橘子重量估算整箱橘子重量(字节豆包 | 371点数解答 | 2026-04-11 13:12:51)84
- Python 实现:根据规则判定 2^n×2^n 方阵中作弊者的赦免命运(字节豆包 | 247点数解答 | 2024-11-03 10:30:46)271
- C语言实现:解决2ⁿ×2ⁿ方阵作弊者赦免问题(字节豆包 | 370点数解答 | 2024-11-03 10:31:31)282
- C语言递归破解2ⁿ×2ⁿ作弊者赦免难题,输出01命运矩阵!(百度文心 | 792点数解答 | 2024-11-03 10:36:04)355