如何修正C语言中统计西侧可见建筑物数量的未完成代码?
问题分析与代码修正
需求说明:约翰身处大城市,观察一片N×N布局的建筑群。需编写C语言程序,统计从西侧观察时每行中可见的建筑物数量——仅当建筑物未被前方(西侧)更高或同等高度的建筑遮挡时才算可见。
输入格式:第一行输入区域大小N,随后输入N行,每行N个建筑物高度值。
输出格式:每行输出可见建筑物数量,后跟|和该行的高度数据。
原代码存在的问题
- 全局统计而非逐行统计:
max和count变量定义在所有循环外部,遍历所有行后,count存储的是所有行可见建筑的总数,而非每行单独的数量,最终所有行都会显示同一个错误的统计值。 - 初始值设置不严谨:
max初始化为0,若建筑物高度包含0(逻辑上需兼容该场景),会导致第一个高度为0的建筑无法被统计。
修正后的代码
#include <stdio.h> int main() { int n; scanf("%d", &n); int building[n][n]; // 读取建筑高度数据 for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { scanf("%d", &building[i][j]); } } // 逐行统计可见建筑数量并输出 for(int i = 0; i < n; i++) { int max_height = -1; // 初始化为比可能的最小高度更小的值 int visible_count = 0; for(int j = 0; j < n; j++) { if(building[i][j] > max_height) { visible_count++; max_height = building[i][j]; } } // 输出当前行的统计结果和高度数据 printf("%d |", visible_count); for(int j = 0; j < n; j++) { printf(" %d", building[i][j]); } puts(""); } return 0; }
修改要点说明
- 逐行重置统计变量:将
max_height和visible_count移至外层循环(每行的循环)内部,确保每行统计前都重置为初始状态,实现独立统计每行的可见建筑数。 - 优化初始值:将
max_height初始化为-1,确保即使建筑高度为0也能被正确统计(0 > -1,会被计入可见数量)。 - 合并统计与输出逻辑:将统计每行数据和输出该行结果的代码合并到同一个外层循环中,避免额外的循环遍历,提升代码效率。
内容的提问来源于stack exchange,提问作者Darwin Leonard
相关产品推荐
相关产品推荐

