校田径运动会上A,B,C,D,E分获百米、四百米、跳高、跳远和三级跳冠军。
观众甲说:B获三级跳冠军,D获跳高冠军。
观众乙说:A获百米冠军,E获跳高冠军。
观众丙说:C获跳远冠军,D获四百米冠军。
观众丁说:B获跳高冠军,E获三级跳冠军。
实际情况是每人说对一句,说错一句。请编程求出A,B,C,D,E各获哪项冠军。
//************************************************
//* Source Name: ChapterFour_ExerciseThree.cpp
//* Founction : Find out which championship A,B,C,D and E will win
//* Author : Skyera
//* Create Time : 2025-7-21
//* Modify :
//* Modify Time:
//************************************************
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<string> events = {"百米","四百米","跳高","跳远","三级跳"};
vector<int> assignment = {0, 1, 2, 3, 4}; // 初始分配:A-百米,B-四百米,...
do{
// assignment[i] 表示选手i+1获得的项目索引
bool valid = true;
// 验证观众甲的陈述:B获三级跳冠军,D获跳高冠军
bool aOne = (assignment[1] == 4);
bool aTwo = (assignment[3] == 2);
if((aOne && aTwo) || (!aOne && !aTwo)) valid = false;
// 验证观众乙的陈述:A获百米冠军,E获跳高冠军
bool bOne = (assignment[0] == 0);
bool bTwo = (assignment[4] == 2);
if((bOne && bTwo) || (!bOne && !bTwo)) valid = false;
// 验证观众丙的陈述:C获跳远冠军,D获四百米冠军
bool cOne = (assignment[2] == 3);
bool cTwo = (assignment[3] == 1);
if((cOne && cTwo) || (!cOne && !cTwo)) valid = false;
// 验证观众丁的陈述:B获跳高冠军,E获三级跳冠军
bool dOne = (assignment[1] == 2);
bool dTwo = (assignment[4] == 4);
if((dOne && dTwo) || (!dOne && !dTwo)) valid = false;
if(valid){
cout << "找到符合条件的分配: " << endl;
vector<char> players = {'A', 'B', 'C', 'D', 'E'};
for(int i=0; i<5; i++){
cout << players[i] << "获得" <<events[assignment[i]] << "冠军" << endl;
}
return 0;
}
}while(next_permutation(assignment.begin(), assignment.end()));
cout << "未找到符合条件的分配" << endl;
return 0;
}