乖乖,比賽後忘記了名次?咱們上! 演算法伺候!難度指數: **
知之者不如好之者,好之者不如樂之者。
-- 孔子 --
乖乖,比賽後忘記了名次?咱們上! 演算法伺候!
【問題區】
在一次競賽中,A、B、C、D、E等五人經過激烈的角逐,最終取得了各自的名次,他們的一個好朋友很遺憾沒有觀看到比賽,在比賽結束後這個朋友詢問他們之間的名次是得知:C不是第一名,D比E低二個名次,而E不是第二名,A即不是第一名,也不是最後一名,B比C低一個名次。編寫程式,計算這五個人各自的名次並輸出。
【提示區】
這是一道邏輯推理題。其中的關鍵點在D比E低兩個名次,那麼D和E的位置只可能在(1,3)、(2,4)
【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;
}