我的代码如下:
其中hurt表示每次星辰能量给出的伤害,dfs函数的思路是敌方一个随从生命值减少后,检查每个随从的生命是否都小于0,即cnt==n,如果是说明此方案可行,answer++,
我的代码如下:
其中hurt表示每次星辰能量给出的伤害,dfs函数的思路是敌方一个随从生命值减少后,检查每个随从的生命是否都小于0,即cnt==n,如果是说明此方案可行,answer++,
引自免费微信小程序:皆我百晓生:
从你提供的代码来看,我发现了一些逻辑错误和未定义行为,这可能是导致你的程序未能正确解决问题的原因。下面是修改后的代码,我将逐点解释修改的部分:
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int t, n, a[N], answer;
// 修改了dfs函数的参数列表和实现逻辑
void dfs(int currentHurt, int totalHurt) {
// 如果已经考虑完所有伤害等级且所有随从都被击败
if (totalHurt == 0 && all_of(a + 1, a + 1 + n, [](int x) { return x <= 0; })) {
answer++;
return;
}
// 如果当前伤害等级不足以击败任何剩余血量的随从,直接返回
if (currentHurt <= 0) return;
for(int i = 1; i <= n; i++) {
// 尝试对第i个随从应用当前伤害
if (a[i] > 0) {
int temp = a[i]; // 保存原始血量,以便回溯
a[i] -= currentHurt;
if (a[i] <= 0) { // 如果随从被击败,递归尝试下一个伤害等级
dfs(currentHurt - 1, totalHurt - 1);
}
a[i] = temp; // 回溯,恢复随从原始血量
}
}
}
int main() {
cin >> t;
while(t--) {
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
answer = 0;
dfs(5, 5); // 初始伤害为5,总共需要递减5次
cout << answer << endl;
answer = 0; // 清零answer,准备处理下一组数据
}
return 0;
}
dfs函数参数修改:原代码中仅用hurt
表示当前伤害,但未明确指出总共考虑了多少次伤害(即递减次数)。我增加了totalHurt
参数来跟踪递减次数,确保当递减到0次时检查所有随从是否都被击败。
逻辑判断优化:在递归结束条件中使用C++标准库中的all_of
函数,更简洁地判断所有随从是否都被击败。
避免重复递归:在对每个随从尝试伤害之前,先检查当前伤害是否还有意义(即currentHurt > 0
),否则直接返回,避免无效递归。
回溯:在尝试对某个随从施加伤害之后,必须回溯,恢复该随从的原始血量,这样可以正确地探索所有可能的方案而不影响后续的决策。
主函数调用dfs修正:在主函数中调用dfs(5, 5)
,明确指出初始伤害是5,并且总共需要递减5次。
通过以上修改,你的代码应该能够正确计算出“星辰能量”能击败所有敌方随从的方案数。请尝试运行修改后的代码并检查结果是否符合预期。