You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套循环与判断结构中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;
}

当前代码存在两个核心问题:

  1. printf("Case #%d:", i);放在内层循环,会重复输出用例编号
  2. 错误使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:40:30