4.6 求出A,B,C,D,E各获哪项冠军

发布于:2025-07-24 ⋅ 阅读:(19) ⋅ 点赞:(0)

校田径运动会上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;
}


网站公告

今日签到

点亮在社区的每一天
去签到