乖乖,比赛后忘记了名次?咱们上! 算法伺候!难度指数: **
知之者不如好之者,好之者不如乐之者。
-- 孔子 --
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
乖乖,比赛后忘记了名次?咱们上! 算法伺候!
【问题区】
在一次竞赛中,A、B、C、D、E等五人经过激烈的角逐,最终取得了各自的名次,他们的一个好朋友很遗憾没有观看到比赛,在比赛结束后这个朋友询问他们之间的名次是得知:C不是第一名,D比E低二个名次,而E不是第二名,A即不是第一名,也不是最后一名,B比C低一个名次。编写程序,计算这五个人各自的名次并输出。
【提示区】
这是一道逻辑推理题。其中的关键点在D比E低两个名次,那么D和E的位置只可能在(1,3)、(2,4)或(3,5),而E不是第二名,后面还有其他条件,这下你懂了吧?
【C代码实现区】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/************************************
*功能:对候选方案进行逻辑推理
*参数说明:
* scheme - 5个参赛者当前的排名
*
*返回值: 符合推理返回1,否则返回0
************************************/
int logic_reasoning(char scheme[5] ) {
//判断一:C不是第一名
if (scheme[0] == 'C') return 0;
//判断二:D比E低两个名次
int flag = 0;
for (int k = 0; k<3; k++) {
//存在 E是D的前两名的情况
if (scheme[k] == 'E' && scheme[k + 2] == 'D') {
flag = 1;
}else continue;
}
if (flag == 0) return 0;//没有可选方案
//判断三: E不是第二名
if (scheme[1] == 'E') return 0;
//判断四: A不是第一名,也不是最后一名
if (scheme[0] == 'A' || scheme[4] == 'A') return 0;
//判断五 B比C低一个名次
flag = 0;
for (int k = 0; k<4; k++) {
if (scheme[k] == 'C' && scheme[k + 1] == 'B') {
flag = 1;
}
else continue;
}
if (flag == 0) return 0;//没有可选方案
return 1;
}
int main(void) {
char player[5] = { 'A','B','C','D','E' };//候选人
char cur[5]; //保存当前当前可能的各种排名
memset(cur, '\0', sizeof(char) * 5);
/*采用穷举法列出五位选手所有可能的情况,对每种情况分别进行逻辑推理*/
for (int i0=0; i0<5; i0++) {
cur[0] = player[i0];
for (int i1=0; i1<5; i1++) {
//排除与第一候选人相同者
if (i1 == i0) continue;
cur[1] = player[i1];
for (int i2=0; i2<5; i2++) {
//排除与第一、二候选人相同者
if (i2 == i1 || i2 == i0) continue;
cur[2] = player[i2];
for (int i3=0; i3<5; i3++) {
//排除与第一、二、三候选人相同者
if (i3 == i2|| i3 == i1|| i3==i0){
continue;
}
cur[3] = player[i3];
for (int i4=0; i4<5; i4++) {
//排除与第一、二、三、四候选人相同者
if (i4 == i3|| i4 == i2|| i4 == i1||i4 == i0){
continue;
}
cur[4] = player[i4];
//得到了我们想要得排列
//还等什么呀,两个字:打印!
if (logic_reasoning(cur)) {
printf("已为您找到结果:\n");
for (int j = 0; j<5; j++) {
printf(" %c", cur[j]);
}
printf("\n");
}
}
}
}
}
}
system("pause");
return 0;
}