1.3 跳水选手名次问题
题目描述
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
分析
题目要求
编程确定比赛的名次
从题目要求可以确定本题重心应放在选手名次上,初步构想是枚举五人名次,逐一排查。
已知条件
5位运动员参加比赛
使用5个变量a,b,c,d,e分别记录五人名次。
每个人说了两句话,一对一错。
使用5个变量wordA,wordB,wordC,wordD,wordE分别记录每个人说对的个数。
变量转化
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
wordA = (b == 2) + (a == 3);
wordB = (b == 2) + (e == 4);
wordC = (c == 1) + (d == 2);
wordD = (c == 5) + (d == 3);
wordE = (e == 4) + (a == 1);
实现
代码
#include <stdio.h> #include <stdlib.h> int main() { // A,B,C,D,E五人名次,取值范围1,2,3,4,5 int a,b,c,d,e; // 五人说对的个数,取值范围0,1,2 int wordA,wordB,wordC,wordD,wordE; // 有无解标记,初始值0 int flag = 0; // 枚举 for (a = 1 ; a <= 5 ; a++) { for (b = 1 ; b <= 5 ; b++) { for (c = 1 ; c <= 5 ; c++) { for (d = 1 ; d <= 5 ; d++) { for (e = 1 ; e <= 5 ; e++) { /****************判断名次******************** * 若名次相同,跳过此轮循环 ********************************************/ if (a == b || a == c || a == d || a == e || b == c || b == d || b == e || c == d || c == e || d == e) { continue; } /****************************************** * 更新变量值 *******************************************/ wordA = (b == 2) + (a == 3); wordB = (b == 2) + (e == 4); wordC = (c == 1) + (d == 2); wordD = (c == 5) + (d == 3); wordE = (e == 4) + (a == 1); /***************************************** * 核心条件 * 若每人说的话一对一错--》输出结果,并置有无解标记flag为1 ******************************************/ if (wordA == 1 && wordB == 1 && wordC == 1 && wordD == 1 && wordE == 1) { printf(" A选手是第 %d 名\n",a); printf(" B选手是第 %d 名\n",b); printf(" C选手是第 %d 名\n",c); printf(" D选手是第 %d 名\n",d); printf(" E选手是第 %d 名\n",e); flag = 1; } } } } } } /****************************** * 有无解判断 * 若无解,输出无解 * ****************************/ if (!flag) { printf("无解\n"); } system("pause"); return 0; }
运行结果