运动会--模拟-东师算法真题

这篇博客介绍了如何通过编程解决一个逻辑谜题,即在一场校田径运动会上,五名选手A、B、C、D、E分别获得百米、四百米、跳高、跳远和三级跳冠军。观众给出了四种可能的冠军情况,但每人都只说对了一半。博主使用C++编写了两个程序,通过遍历所有可能性并检查条件,成功找出每个项目的正确冠军。这展示了逻辑推理和编程解决问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

校田径运动会上A、B、C、D、E5人分获百米、四百米行跳高、跳远和三级跳冠军。
观众甲说:B获三级跳冠军,D获跳高冠军
观众乙说: A获百米冠军,E获跳高冠军
观众丙说: C获跳远冠军,D获四百米
冠军观众丁说: B获跳高冠军,E获三级跳冠军
实际情况是每人说对一句,说错一句。请编程求出哪项冠军。(I5分)

思路:for循环遍历所有条件,用三个map来记录用过的防止重复和冲突,最后记录可以的条件输出缺少的一一匹配即可具体代码如下:

 #include<bits/stdc++.h>
using namespace std;
map<int,int>A;
map<char,string>ans;
map<int,int>B; 
map<int,int>G; 
string s[6] ; 
int book[10];
void judge(int i, int j,int z,int h) {
	if(i == 1) {
		ans['B'] = "三级跳冠军";book[5] = 1;
	}else {
		ans['D'] = "跳高冠军";book[3] = 1;
	}
	if(j == 1) {
		ans['A'] = "百米冠军";book[1] = 1;
	}else {
		ans['E'] = "跳高冠军";book[3] = 1;
	}
	if(z == 1) {
		ans['C'] = "跳远冠军";book[4] = 1;
	}else {
		ans['D'] = "四百米";book[2] = 1;
	}
	if(h == 1) {
		ans['B'] = "跳高冠军";book[3] = 1;
	}else {
		ans['E'] = "三级跳冠军";book[5] = 1;
	}
	for(int i = 0;i < 5;++i) {
		if(ans[i+'A'] == "") {
			for(int j = 1;j <= 5;++j) {
				if(book[j] == 0) {
					cout << char(i+'A') <<  "获" << s[j] << '\n';break;
				}
			}
		}
		else {
			cout << char(i+'A') << "获" << ans[i+'A'] << '\n';
		}
	}
	cout << "------------------------" << endl;
}
int main(){
	s[1] = "百米冠军";
	s[2] = "四百米冠军";
	s[3] = "跳高冠军";
	s[4] = "跳远冠军";
	s[5] = "三级跳冠军";
	for(int i = 0;i <= 1;++i)  {
		for(int j = 0;j <= 1;++j) {
			for(int z = 0;z <= 1;++z) {
				for(int h = 0;h <= 1;++h) {
					int flag = 0;
					if(i) {
						if(A[5] == 1 || B[2] == 1) {
							flag = 1;
						}
						A[5] = 1;
						B[2] = 1;
						G[5] = 2;
					}else {
						if(A[3] == 1 || B[4] == 1) {
							flag = 1;
						}
						A[3] = 1;
						B[4] = 1;
						G[3] = 4;
					}
					if(j) {
						if(A[1] == 1 || B[1] == 1) {
							flag = 1;
						}
						A[1] = 1;
						B[1] = 1;
						G[1] = 1;
					}else {
						if(A[3] == 1 || B[5] == 1) {
							flag = 1;
						}
						A[3] = 1;
						B[5] = 1;
						G[3] = 5;
					}
					if(z) {
						if(A[4] == 1 || B[3] == 1) {
							flag = 1;
						}
						A[4] = 1;
						B[3] = 1;
						G[4] = 3;
					}else {
						if(A[2] == 1 || B[4] == 1) {
							flag = 1;
						}
						A[2] = 1;
						B[4] = 1;
						G[2] = 4;
					}
					if(h) {
						if(A[3] == 1 || B[2] == 1) {
							flag = 1;
						}
						A[3] = 1;
						B[2] = 1;
						G[3] = 2;
					}else {
						if(A[5] == 1 || B[5] == 1) {
							flag = 1;
						}
   						A[5] = 1;
   						B[5] = 1;
   						G[5] = 5;
					}
//fen
					if(i) {
						if(G[4] == 3) {
							flag = 1;
						}
					}else {
						if(G[2] == 5) {
							flag = 1;
						}
					}
					if(j) {
						if(G[5] == 3) {
							flag = 1;
						}
					}else {
						if(G[1] == 1) {
							flag = 1;
						}
					}
					if(z) {
						if(G[4] == 2) {
							flag = 1;
						}
					}else {
						if(G[3] == 4) {
							flag = 1;
						}
					}
					if(h) {
						if(G[5] == 5) {
							flag = 1;
						}
					}else {
						if(G[2] == 3) {
							flag = 1;
						}
					}
					if(flag == 0) {
						judge(i, j, z, h);
					}	
					A[1] = 0, A[2] = 0,A[3] = 0, A[4] = 0,A[5] = 0;
					B[1] = 0, B[2] = 0,B[3] = 0, B[4] = 0,B[5] = 0;
				}
			}
		}
	}
	return 0;
}

简单方法 

#include<bits/stdc++.h>
using namespace std;
int book[10];
int main() {
	for (int A = 1; A <= 5; ++A) {
		for (int B = 1; B <= 5; ++B) {
			for(int C = 1;C <= 5;++C) {
				for(int D = 1;D <= 5;++D) {
					for(int E = 1;E <= 5;++E) {
						memset(book,0, sizeof(book));
						if(book[A] == 0) {
							book[A] = 1;
						}
						else {
							continue;
						}
						if(book[B] == 0) {
							book[B]= 1;
						}
						else {
							continue;
						}
						 if(book[C] == 0) {
							book[C]= 1;
						}
						else {
							continue;
						}
						if(book[D] == 0) {
							book[D]= 1;
						}
						else {
							continue;
						}
						if(book[E] == 0) {
							book[E]= 1;
						}
						else {
							continue;
						}
						bool h1 = (B == 5 && D != 3) || (B != 5 && D == 3);
						bool h2 = (A == 1 && E != 3) || (A != 1 && E == 3);
						bool h3 = (C == 4 && D != 2) || (C != 4 && D == 2);
						bool h4 = (B == 3 && E != 5) || (B != 3 && E == 5);
						
						if(h1 && h2 && h3 && h4) {
							cout << A << B << C << D << E << '\n';
						}
					}
				}
			} 
		}
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-lyslyslys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值