1. 程式人生 > >乖乖,比賽後忘記了名次?咱們上! 演算法伺候!難度指數: **

乖乖,比賽後忘記了名次?咱們上! 演算法伺候!難度指數: **

知之者不如好之者,好之者不如樂之者。

-- 孔子 --

 

 

 乖乖,比賽後忘記了名次?咱們上! 演算法伺候! 


 

【問題區】

 

在一次競賽中,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;

}