1、题目描述
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果,
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
2、算法分析
首先,一共5位选手,那么每个人都需要遍历5次(每个人的排名有5种可能),然后设置筛选条件,即可得到每个人的名次,解决此类问题的关键就在于筛选的条件。由于每个选手都说对了一半,因此每位选手的陈述内容可以转换为(要么前者成立,要么后者成立,二者必居其一)。那么5位选手的陈述内容转换成表达式的值必然等于5(即就是说每位选手的陈述内容转换成表达式的值必为1),但这个筛选条件还不足以求出选手的名次,因为一个人一旦得了第一名,就不可能再得到第二名。每个人的名次必然是1-5之间的数字且不能重复,满足这个条件的值就是五个人名次的乘积,无论怎么排列,乘积一直都是1*2*3*4*5=120。综上所述,筛选条件只要满足表达式的值为6即可求出每位选手的名次(ps:找一个不会发生变化的量)。
3、源代码
#define _CRT_SECURE_NO_WARNINGS 1 /* * Copyright (c) 2018, code farmer from sust * All rights reserved. * * 文件名称:JudgeRank.c * 功能:求解名次 * * 当前版本:V1.0 * 作者:sustzc * 完成日期:2018年4月4日23:07:24 */ # include <stdio.h> /* * 函数名称:JudgeRank * * 函数功能:判断名次 * * 入口参数:void * * 出口参数:void * * 返回类型:void */ void JudgeRank(void) { int A = 0; int B = 0; int C = 0; int D = 0; int E = 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 ( 6 == ( ((2 == B) && (3 != A)) || ((2 != B) && (3 == A)) ) + ( ((2 == B) && (4 != E)) || ((2 != B) && (4 == E)) ) + ( ((1 == C) && (2 != D)) || ((1 != C) && (2 == D)) ) + ( ((5 == C) && (3 != D)) || ((5 != C) && (3 == D)) ) + ( ((4 == E) && (1 != A)) || ((4 != E) && (1 == A)) ) + ( (120 == A*B*C*D*E) ) ) { printf("A = %d, B = %d, C = %d, D = %d, E = %d\n",A, B, C, D, E); } else { ; } } } } } } return; } int main(void) { JudgeRank(); return 0; }
不足:if判断条件过于繁琐,并且漏掉了5 == (A+B+C+D+E)这一条件,下面给出稍微优化后的代码。
/* * 函数名称:JudgeRank * * 函数功能:判断名次 * * 入口参数:void * * 出口参数:void * * 返回类型:void */ void JudgeRank(void) { int A = 0; int B = 0; int C = 0; int D = 0; int E = 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 ( (1 == ((2 == B) + (3 == A))) && (1 == ((2 == B) + (4 == E))) && (1 == ((1 == C) + (2 == D))) && (1 == ((5 == C) + (3 == D))) && (1 == ((4 == E) + (1 == A))) && (120 == A * B * C * D *E) && (15 == (A + B + C + D + E)) ) { printf("A = %d, B = %d, C = %d, D = %d, E = %d\n",A, B, C, D, E); } else { ; } } } } } } return; }
4、输出结果