习题4.3 解出比赛的实际名次

5位跳水高手将参加10m高台跳水决赛,有好事者让5人据实力预测比赛结果。

A选手说: B第二,我第三。

B选手说: 我第二,E第四。

C选手说: 我第一,D第二。

D选手说: C最后,我第三。

E选手说: 我第四,A第一。

决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错。请编程解出比赛的实际名次。

//************************************************
//* Source Name: ChapterFour_ExerciseThree.cpp
//* Founction  : The actual position of the completion
//* Author	   : Skyera
//* Create Time	   : 2025-7-19
//* Modify	   : 
//* Modify Time:
//************************************************
#include 
#include 
#include 

using namespace std;

bool checkPrediction(const vector& ranking)
{
	// 获取每个选手的实际名次,注意排名是1-based
	int a_rank = find(ranking.begin(), ranking.end(), 1) - ranking.begin() + 1;
	int b_rank = find(ranking.begin(), ranking.end(), 2) - ranking.begin() + 1;
	int c_rank = find(ranking.begin(), ranking.end(), 3) - ranking.begin() + 1;
	int d_rank = find(ranking.begin(), ranking.end(), 4) - ranking.begin() + 1;
	int e_rank = find(ranking.begin(), ranking.end(), 5) - ranking.begin() + 1;
	
	// 检查每个选手的预测是否一对一错
	bool a_correct = (b_rank == 2) + (a_rank == 3) == 1;
	bool b_correct = (b_rank == 2) + (e_rank == 4) == 1;
	bool c_correct = (c_rank == 1) + (d_rank == 2) == 1;
	bool d_correct = (c_rank == 5) + (d_rank == 3) == 1;
	bool e_correct = (e_rank == 4) + (a_rank == 1) == 1;
	
	return a_correct && b_correct && c_correct && d_correct && e_correct;
}

int main()
{
	vector ranking = {1, 2, 3, 4, 5};
	// 生成所有排列并检查
	do{
		if(checkPrediction(ranking)){
			cout << "比赛实际名次: " << endl;
			for(int i=0; i<5; i++){
				cout << static_cast('A' + ranking[i] - 1)
					 << "选手排名第 "  << i + 1 << endl;
			}
			break;
		}
	}while(next_permutation(ranking.begin(), ranking.end()));
	
	return 0;
}

习题4.3 解出比赛的实际名次_第1张图片

你可能感兴趣的:(c++,算法,开发语言)