33,008
社区成员
发帖
与我相关
我的任务
分享
// 本次递归轮到a队罚球
// a_kicks: a队已罚球的次数
// a_scores: a队进球的次数
// b_kicks: b队已罚球的次数
// b_scores: b队进球的次数
// total_kicks: 总罚球次数
// result_count: 不同的得分场面的次数
static void one_kick_result(int a_kicks, int a_scores, int b_kicks, int b_scores, const int total_kicks,
int &result_count, vector<int> &results)
{
ofstream outfile("data.txt");
if (a_kicks == total_kicks) // a队已罚球次数与总次数相等,罚球结束
{
++result_count;
print_sequence(results.begin(), results.end(), outfile);
cout << endl;
return;
}
// a队罚球,球进了
++a_kicks;
++a_scores;
results.push_back(1);
if (a_scores > b_scores + total_kicks - b_kicks) // 即使b队剩下的罚球都进了,a队仍然赢
{
++result_count;
print_sequence(results.begin(), results.end(), outfile);
cout << endl;
return;
}
one_kick_result(b_kicks, b_scores, a_kicks, a_scores, total_kicks, result_count, results); // 轮到b队罚球
results.pop_back();
// a队罚球,球没进
--a_scores;
results.push_back(0);
if (a_scores + total_kicks - a_kicks < b_scores) // 即使a队剩下的罚球都进了,b队仍然赢
{
++result_count;
print_sequence(results.begin(), results.end(), outfile);
cout << endl;
return;
}
one_kick_result(b_kicks, b_scores, a_kicks, a_scores, total_kicks, result_count, results); // 轮到b队罚球
results.pop_back();
}
void simulate_penalty_kick_round()
{
const int total_kicks = 5;
int a_kicks = 0, a_scores = 0, b_kicks = 0, b_scores = 0;
int result_count = 0;
vector<int> results;
one_kick_result(a_kicks, a_scores, b_kicks, b_scores, total_kicks, result_count, results);
cout << "不同的得分场面共有" << result_count << "种" << endl;
}