C++计算矩阵中T字图形个数的实现与开发建议
### 🌟思路分析 要计算矩阵中由`#`构成的 T 字图形的个数,我们需要遍历矩阵中的每个元素,对于每个`#`元素,检查其是否能作为 T 字图形的中心。一个`#`能构成 T 字图形,需要满足其上方有一个`#`,且其左方和右方至少各有一个`#`。 ### 💻代码实现 ```cpp #include <iostream> #include <vector> // 检查当前元素是否构成 T 字图形 bool isT(const std::vector<std::vector<char>>& matrix, int i, int j, int n, int m) { // 检查上方元素 bool up = (i > 0) && (matrix[i - 1][j] == '#'); // 检查左方元素 bool left = false; for (int k = j - 1; k >= 0; --k) { if (matrix[i][k] == '#') { left = true; break; } } // 检查右方元素 bool right = false; for (int k = j + 1; k < m; ++k) { if (matrix[i][k] == '#') { right = true; break; } } return up && left && right; } int main() { int n, m; // 读取矩阵的行数和列数 std::cin >> n >> m; // 定义二维向量存储矩阵 std::vector<std::vector<char>> matrix(n, std::vector<char>(m)); // 读取矩阵元素 for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { std::cin >> matrix[i][j]; } } int tCount = 0; // 遍历矩阵中的每个元素 for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { // 检查当前元素是否为 '#' if (matrix[i][j] == '#') { // 如果构成 T 字图形,计数器加一 if (isT(matrix, i, j, n, m)) { tCount++; } } } } // 输出 T 字图形的个数 std::cout << tCount << std::endl; return 0; } ``` ### 📋代码解释 1. **输入处理**: - 首先读取矩阵的行数`n`和列数`m`。 - 然后使用二维向量`matrix`存储矩阵元素,通过嵌套的`for`循环逐行逐列读取矩阵元素。 2. **T 字图形判断**: - 定义`isT`函数来判断当前元素是否构成 T 字图形。 - 在`isT`函数中,分别检查上方元素、左方元素和右方元素是否为`#`。 - 对于左方和右方元素,使用`for`循环从当前元素向左右两侧搜索,只要找到一个`#`就标记为`true`。 3. **遍历矩阵**: - 在`main`函数中,使用嵌套的`for`循环遍历矩阵中的每个元素。 - 对于每个`#`元素,调用`isT`函数进行判断,如果构成 T 字图形,则将计数器`tCount`加 1。 4. **输出结果**: - 最后输出`tCount`,即 T 字图形的个数。 ### ⚙️开发建议 - **异常处理**:在实际应用中,可对输入的`n`和`m`进行范围检查,确保满足`1 ≤ n, m ≤ 5`。若不满足,可输出错误信息并终止程序。 - **代码复用**:可将输入矩阵和输出结果的逻辑封装成独立函数,提高代码复用率。 - **性能优化**:对于大规模矩阵,当前代码的时间复杂度较高。可考虑使用预处理或其他算法优化,减少不必要的重复检查。 ### 📚学习资源 - [C++ 官方文档](https://en.cppreference.com/w/):提供了 C++ 语言的详细文档和教程。 - 《C++ Primer》:经典的 C++ 学习书籍,适合系统学习 C++ 语言的初学者。 ######[AI写代码神器 | 1056点数解答 | 2026-08-08 15:23:46]
- C++ 实现:轻松计算两个矩阵的乘法并输出结果(字节豆包 | 381点数解答 | 2025-12-03 19:20:23)249
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)558
- 揭秘!十进制整数转其他进制用啥存储结构最合适?答案竟是它!(字节豆包 | 57点数解答 | 2024-11-13 01:21:11)323
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)474
- C++ 实现游戏赢家判断:巧妙找出满足和条件的最大数 (DeepSeek | 506点数解答 | 2025-06-20 16:18:09)182
- C++ 实现根据部分橘子重量估算整箱橘子重量(字节豆包 | 371点数解答 | 2026-04-11 13:12:51)81
- Python 实现:根据规则判定 2^n×2^n 方阵中作弊者的赦免命运(字节豆包 | 247点数解答 | 2024-11-03 10:30:46)269
- C语言实现:解决2ⁿ×2ⁿ方阵作弊者赦免问题(字节豆包 | 370点数解答 | 2024-11-03 10:31:31)279
- C语言递归破解2ⁿ×2ⁿ作弊者赦免难题,输出01命运矩阵!(百度文心 | 792点数解答 | 2024-11-03 10:36:04)353
- Python 实现:计算用户输入 n x n 矩阵边界元素之和(GPT | 319点数解答 | 2024-11-21 00:16:05)191
- DevC++ 实现:计算并输出 n×n 矩阵边界元素之和(GPT | 410点数解答 | 2024-11-21 00:19:17)191
- 月赛作弊者命运裁决:2^n×2^n 方阵赦免递归算法揭秘(DeepSeek | 483点数解答 | 2026-01-05 12:24:54)110