简单的逻辑判断题

来源:互联网 发布:知乎英语发音书推荐 编辑:程序博客网 时间:2024/05/21 04:14

题目1

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

思路

满足条件的情况很多,首先穷举筛选出所有符合话的结果
发现有很多的排名是错误的,比如有第1名没有第2名,有第3名,这种情况显然不存在
所以设了一个变量flag来判断
判断方法,用flag二进制序列的后五位来表示该排名有没有人
例如:
5 4 3 2 1 表示名次对应flag最后五位二进制序列
1 1 1 1 1 表示所有排名均有人,此种情况存在
1 1 1 0 1 表示第2名不存在,其他名次均有人,此种情况不存在
0 0 0 1 1 第1第2均有人,后面三个名次没人,说明有并列的,此种情况存在
也就是说,二进制序列的1必须连续,如果不连续,排名就是错误的
通过这个原理对第一步得到的结果进行筛选,得到正确结果
该题最难得部分在于筛选

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>//A选手说:B第二,我第三;//B选手说:我第二,E第四;//C选手说:我第一,D第二;//D选手说:C最后,我第三;//E选手说:我第四,A第一;int main(){    int A = 0, B = 0, C = 0, D = 0, E = 0;    for (A = 1; A < 5; A++)        for (B = 1; B < 5; B++)            for (C = 1; C < 5; C++)                for (D = 1; D < 5; D++)                    for (E = 1; E < 5; E++)                    {                        if ((B == 2) + (A == 3) == 1)                            if ((B == 2) + (E == 4) == 1)                                if ((C == 1) + (D == 2) == 1)                                    if ((C == 5) + (D == 3) == 1)                                        if ((E == 4) + (A == 1) == 1)                                        {                                            int flag = 0;//用flag来看排名是否正确                                            flag |= 1 << (A - 1);                                            flag |= 1 << (B - 1);//将每个选手的比特位来赋给flag,1为有排名                                            flag |= 1 << (C - 1);//0为此排名无人                                            flag |= 1 << (D - 1);//可知排名序列11011这种中间排名空缺的情况是不存在的                                            flag |= 1 << (E - 1);                                            while (flag)                                            {                                                if ((flag & 1) == 0)//如果该位和1与为0,跳出循环                                                    break;                                                flag >>= 1;                                            }                                            if (flag == 0)                                                printf("A:第%d B:第%d C:第%d D:第%d E:第%d\n", A, B, C, D, E);                                        }                    }    system("pause");    return 0;}

题目2

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯
的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>//A说:不是我。//B说:是C。//C说:是D。//D说:C在胡说int main(){    char killer = 0;    for (killer = 'a'; killer <= 'd'; killer++)        if (3 == (killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd'))            break;    printf("killer is %c\n", killer);    system("pause");    return 0;}
原创粉丝点击