嵌套循环与判断结构中printf语句的位置优化问题
问题描述
需要编写程序判断火灾中被困人员的生死,规则如下:
- 输入包含:测试用例数T、走廊长度N、人员憋气时长K
- 走廊每个字符为
0(无楼梯,无法换气)或1(有楼梯,可换气) - 当连续遇到
0的次数≥K时,判定人员死亡;否则存活
示例输入:
2 8 2 01010100 10 3 0001001110
预期输出:
Case #1: Dead Case #2: Alive
用户编写的代码如下:
#include<stdio.h> int main(){ int T, N, K; scanf("%d", &T); for(int i = 1; i <= T; i++){ scanf("%d %d", &N, &K); getchar(); char hall; int hold = 0; for(int j = 0; j < N; j++){ scanf("%c", &hall); getchar(); printf("Case #%d:", i); if(hall == '0'){ hold++; } else{ hold = 0; } if(hold >= K){ printf("Dead\n"); return 0; } } printf("Alive\n"); return 0; } return 0; }
当前代码存在两个核心问题:
printf("Case #%d:", i);放在内层循环,会重复输出用例编号- 错误使用
return 0,导致处理完第一个测试用例就直接退出程序,无法处理多个测试用例
修正方案
1. 调整printf的位置
把Case #%d:的输出放在内层循环结束后,一次性输出完整的结果行,避免重复打印编号。
2. 移除错误的return 0
内层循环里的return 0会直接终止整个程序,应该改为标记当前用例的结果为死亡,然后跳出内层循环,继续处理后续测试用例;外层循环里的return 0也要去掉,让循环能遍历完所有T个测试用例。
修正后的完整代码
#include<stdio.h> int main(){ int T, N, K; scanf("%d", &T); for(int i = 1; i <= T; i++){ scanf("%d %d", &N, &K); // 吃掉换行符,避免干扰后续字符读取 getchar(); char hall; int hold = 0; // 标记当前用例是否死亡 int is_dead = 0; for(int j = 0; j < N; j++){ scanf("%c", &hall); if(hall == '0'){ hold++; // 达到憋气时长,标记死亡并跳出内层循环 if(hold >= K){ is_dead = 1; break; } } else{ hold = 0; } } // 统一输出当前用例的结果 printf("Case #%d: ", i); if(is_dead){ printf("Dead\n"); } else{ printf("Alive\n"); } } return 0; }
代码说明
- 新增
is_dead变量标记当前用例的结果,避免提前终止程序 - 将结果输出语句放在内层循环结束后,确保每个测试用例只输出一次
Case #x: - 移除了不必要的
getchar()(读取走廊字符时不需要每次都读换行,因为输入的走廊是连续的字符串) - 当检测到连续
0达到K次时,标记is_dead并跳出内层循环,无需继续遍历剩余字符
内容的提问来源于stack exchange,提问作者waterswell
相关产品推荐
相关产品推荐

