乖乖,比赛后忘记了名次?咱们上! 算法伺候!难度指数: **

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

-- 孔子 --

 

 

 

 乖乖,比赛后忘记了名次?咱们上! 算法伺候! 


 

【问题区】

 

在一次竞赛中,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;

}

 


 

posted @ 2018-12-28 01:33 Martin666 阅读(...) 评论(...) 编辑 收藏