逻辑判断题

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一;

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

#include <stdio.h>
#include <stdlib.h>

int Isdiff(int a, int b, int c, int d, int e) {
 //查重函数
 //直接列出所有不等关系
 if (a != b && a != c && a != d && a != e && b != c
  && b != d && b != e && c != d && c != e && d != e) {
  return 1;
 }
 return 0;
}

int Isdiffplus(int a, int b, int c, int d, int e) {
 //查重函数plus
 char tem = 0;        // 0000 0000
 tem |= 1 << (a - 1); // 0000 0001 左移0位          如果5给数字都不一样的话
 tem |= 1 << (b - 1); // 0000 0010 左移1位          最后tem应该是0001 1111  
 tem |= 1 << (c - 1); // 0000 0100 左移2位           也就是2^5 - 1 == 31
 tem |= 1 << (d - 1); // 0000 1000 左移3位           也就是说如果最后tem == 31
 tem |= 1 << (e - 1); // 0001 0000 左移4位            就没有重复的数字
 if (tem == 31) {
  return 1;
 }
 return 0;
}


int main() {
 //直接5重循环遍历一遍所有情况,5的5次方种情况,对计算机来说还是小意思的
 for (int a = 1; a <= 5; a++) {
  for (int b = 1; b <= 5; b++) {
   for (int c = 1; c <= 5; c++) {
    for (int d = 1; d <= 5; d++) {
     for (int e = 1; e <= 5; e++) {
                //两句话说对一半,即一真一假
                 //即两句话逻辑与运算结果为0,逻辑或结果为1
                 //或者 两句话相加等于 1 (即一真一假)
      
      if ((b == 2) + (a == 3) == 1 &&
       (b == 2) + (e == 4) == 1 &&
       (c == 1) + (d == 2) == 1 &&
       (c == 5) + (d == 3) == 1 &&
       (e == 4) + (a == 1) == 1 &&
       Isdiffplus(a, b, c, d, e)) {
       printf("A第%d\nB第%d\nC第%d\nD第%d\nE第%d\n", a, b, c, d, e);
      }
     }
    }
   }
  }
 }
 system("pause");
 return 0;
}

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个

嫌疑犯的一个。以下为4个嫌疑犯的供词。

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手。

#include <stdio.h>
#include <stdlib.h>


int main() {
 int arr[4] = { 0 };
    // arr[0] => A     0 代表他们无罪 
    // arr[1] => B     1 代表他们们有罪
    // arr[2] => C
    // arr[3] => D
    
 for (int i = 0; i < 4; i++) {
  //要从A一直待D开始遍历情况
  arr[i] = 1;//假设这个人有罪
  
  if ((arr[0] != 1) + (arr[2] == 1) +
   (arr[3] == 1) + (arr[3] != 1) == 3) {
   printf("%c是凶手!\n", 'A' + i);
   //'A' + i 即为对应大写字母的ASCII码
  }
  
  arr[i] = 0; //假设后还给他清白 
 }


 system("pause");
 return 0;
}
发布了47 篇原创文章 · 获赞 4 · 访问量 505

猜你喜欢

转载自blog.csdn.net/weixin_45818891/article/details/103378593