打卡5.5
1.问题描述
警察审问4名窃贼嫌疑犯。现在已知,这4人当中仅有一名是窃贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎。
这四个人回答如下
甲:乙没有偷,是丁偷的
乙:我没有偷,是丙偷的
丙:甲没有偷,是乙偷的
丁:我没有偷
请根据这四个人的回答判断谁是窃贼
2.问题分析
四个人里面有一个窃贼,丁说自己没有偷,这个不能看出什么来,只能从前三个人入手。用ABCD分别代表四个人,变量值为1代表这个人是窃贼,根据题可以列出条件
B+D=1
B+C=1
A+B=1
A+B+C+D=1//这个丁说的话什么也看不出来,只知道四个人有一个是窃贼
3.算法设计
要三个表达式同时成立,也就是说B+D==1&&B+C==1&&A+B==1
如果A是窃贼,那么A=1,B=C=D=0,然后带入上面的表达式,如果成立就不用测试了
假如不成立,就假设B是窃贼,就是A=C=D=0,B=1,如果成立,B就是窃贼,如果不成立就假设C为窃贼........一直试下去
4.程序
#include<iostream> using namespace std; int main() { int i, A = 1, B = 0, C = 0, D = 0;//这里先假设A是窃贼 for (i = 1; i <= 4; i++) if (B + D == 1 && B + C == 1 && A + B == 1)//判断符合条件的,如果符合就是窃贼 break; else { if (i == 1)//第一次就试出来了,甲不是窃贼,判断乙是不是 { A = 0; B = 1; } if (i == 2)//这里甲乙都不是,测试丙是不是 { B = 0; C = 1; } if (i == 3)//甲乙丙都不是,测试丁是不是 { C = 0; D = 1; } } if (i == 1) cout << "甲" << endl; if (i == 2) cout << "乙" << endl; if (i == 3) cout << "丙" << endl; if (i == 4) { cout << "丁" << endl; } return 0; }