1 条题解
-
0
题解
题目中的邻居指的是上下左右四个方向的邻居,题目没有说明非常抱歉!
这道题是一道大模拟,模拟题的意思就是根据题意模拟过程,并实现题目要求,一般没有什么复杂的算法要求
这道题看起来很复杂,其实只要捋清关系,实现起来并不复杂
实际上,这道题的任务就是求给出反应堆设计的电量与热量计算,主要理解以下四种机制:
- 发电机制:燃料棒根据效率和中子量产生电力
- 发热机制:燃料棒根据效率和周围发热邻居产生热量
- 冷却机制:散热片根据类型和相邻燃料棒数量吸收热量
- 爆炸条件:任何时候堆温超过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; // 累加发热邻居数 } } //...累加后,按照题目公式计算:
-
效率 = (棒数为当前格的燃料棒数)
-
中子量 = 当前格棒数+相邻中子反射板数*当前格棒数
-
基础发电量 = 单棒基础发电量 × 效率 × 棒数
-
实际发电量 = 基础发电量 + 单棒基础发电量 × 周围中子量 × 棒数
// 计算中子数 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
信息
- ID
- 1129
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 2
- 上传者