1 条题解

  • 0
    @ 2025-11-10 15:34:39

    题解

    题目中的邻居指的是上下左右四个方向的邻居,题目没有说明非常抱歉!

    这道题是一道大模拟,模拟题的意思就是根据题意模拟过程,并实现题目要求,一般没有什么复杂的算法要求

    这道题看起来很复杂,其实只要捋清关系,实现起来并不复杂

    实际上,这道题的任务就是求给出反应堆设计的电量热量计算,主要理解以下四种机制:

    • 发电机制:燃料棒根据效率和中子量产生电力
    • 发热机制:燃料棒根据效率和周围发热邻居产生热量
    • 冷却机制:散热片根据类型和相邻燃料棒数量吸收热量
    • 爆炸条件:任何时候堆温超过10000点就会爆炸

    由于每个游戏刻中各组件的行为是固定的,因此我们可以先计算每一个游戏刻的行为

    只有6*9,我们可以直接遍历,根据遍历到的组件进行操作

    F

    遍历到F,证明这格是燃料棒,让我们回忆与燃料棒有关的要求:

    • 发电效率:与当前格棒数有关
    • 发热量:需要计算周围发热邻居,包括邻居燃料棒数与中子反射板
    • 中子量:当前格棒数+相邻中子反射板数*当前格棒数

    因此我们可以直接遍历该格的邻居,并计数中子板与燃料棒,以便计算发热量

    TIPS:遍历邻居问题时,可以使用循环,通过dx、dy坐标偏移量数组简化计算

    int dx[4] = {-1, 1, 0, 0};
    int dy[4] = {0, 0, -1, 1};
    
    // 遍历到燃料棒
    if (ch == 'F') {
        int r = k;
        int eff = 1 + (r / 2); // 计算效率
        int neighFuel = 0; // 统计邻居燃料棒数
        int neighPlate = 0; // 统计邻居中子板数
        int neighHeat = 0; // 统计发热邻居数
        // 遍历四个方向的邻居
        for (int d = 0; d < 4; d++) {
            int ni = i+dx[d], nj = j+dy[d];
            if (ni<0 || ni>=R || nj<0 || nj>=C) continue; // 防止越界
            char nc = g[ni][nj];
            if (nc == 'F') {
                neighFuel += cnt[ni][nj]; // 累加燃料棒数
                neighHeat += 1; // 累加发热邻居数
            } else if (nc == 'N') {
                neighPlate += 1; // 累加中子反射板数
                neighHeat += 1; // 累加发热邻居数
            }
        }
        //...
    

    累加后,按照题目公式计算:

    • 效率 = 1+棒数21 + \lfloor\frac{\text{棒数}}{2}\rfloor(棒数为当前格的燃料棒数)

    • 中子量 = 当前格棒数+相邻中子反射板数*当前格棒数

    • 基础发电量 = 单棒基础发电量 × 效率 × 棒数

    • 实际发电量 = 基础发电量 + 单棒基础发电量 × 周围中子量 × 棒数

    // 计算中子数
        int neutron = r+neighFuel+1*neighPlate*r;
    
        // 计算发电量
        const int baseE = 100;
        int basic = baseE*eff*r;
        int actual = basic+baseE*neutron*r;
        energy += actual; // 累加到每个游戏刻发电量中
    
        // 计算发热量
        int fe = eff+neighHeat;
        const int baseH = 50;
        int heatT = baseH*(fe*(fe+1))*r/2;
        heat += heatT; // 累加到每个游戏刻发热量中
    }
    //...
    

    R G D

    遍历到这三个,证明这格是某种散热片,让我们回忆散热片的需求:

    • 红石散热片:基础4点 + 每相邻燃料棒2点散热
    • 金散热片:基础6点 + 每相邻燃料棒3点散热
    • 钻石散热片:基础12点 + 每相邻燃料棒6点散热

    因此我们还需要统计相邻燃料棒数

    根据不同散热片计算散热量,在当前游戏刻发热量上减去即可

    else if (ch == 'R' || ch == 'G' || ch == 'D') {
    
        int adjFuel = 0;
        for (int d = 0; d < 4; d++) {
            int ni = i+dx[d], nj = j+dy[d];
            if (ni<0 || ni>=R || nj<0 || nj>=C) continue; // 越界跳过
            if (g[ni][nj] == 'F') adjFuel += cnt[ni][nj]; // 计算相邻燃料棒数
        }
        if (ch == 'R') {
            // 红石散热片:基础4 + 每相邻燃料棒2
            cool += 4+2*adjFuel;
        } else if (ch == 'G') {
            // 金散热片:基础6 + 每相邻燃料棒3
            cool += 6+3*adjFuel;
        } else { // 'D'
            // 钻石散热片:基础12 + 每相邻燃料棒6
            cool += 12+6*adjFuel;
        }
    }
    //...
    
    

    合计

    计算完每一游戏刻的发电,发热,冷却量信息后,是时候汇总了

    在这里统计总发电量与堆温(累加净发热量)

    并随时判断是否超过10000,若超过可以直接判为爆炸

    int totalE = 0; // 总计电量
    int totalH = 0; // 堆温
    bool exploded = false; // 是否爆炸
    // 一个个游戏刻遍历
    for (int i = 1; i <= t; i++) {
        totalE += energy;
        int net = heat-cool; // 计算净发热量
        totalH += net; // 累加到堆温上
        // 若堆温大于10000爆炸
        if (totalH > 10000) {
            exploded = true;
            break;
        }
    }
    
    if (exploded) {
        cout <<"Explosion!!!"<<endl;
    } else {
        cout <<"Stable"<<endl<< totalE <<endl;
    }
    
    • 1

    [2025 实验室三面] 核电,轻而易举啊!

    信息

    ID
    1129
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    7
    已通过
    2
    上传者