思路:
根据题意可知A、B、C、D四个人只有1个做了好事,则有以下4种状态:(做好事的为1,其他的为0)
状态1:A == 1 B == 0 C == 0 D == 0
状态2:A == 0 B == 1 C == 0 D == 0
状态3:A == 0 B == 0 C == 1 D == 0
状态4:A == 0 B == 0 C == 0 D == 1
所谓枚举,就是按照这4种状态的假定,去逐一的去测试4个人中有几句真话
若有3句则该状态成立,其他则该状态不成立
#include <iostream>
using namespace std;
int main()
{
for(int a = 0; a <= 1; a++)
{
for(int b = 0; b <= 1; b++)
{
for(int c = 0; c <= 1; c++)
{
for(int d = 0; d <= 1; d++)
{
if(a + b + c + d == 1) // 限定做好事的人的个数
{
int cc1 = (a == 0);
int cc2 = (c == 1);
int cc3 = (d == 1);
int cc4 = (d == 0);
if(cc1 + cc2 + cc3 + cc4 == 3)
{
cout << "A" << (a == 1 ? "做了" : "没做") << "好事" << endl;
cout << "B" << (b == 1 ? "做了" : "没做") << "好事" << endl;
cout << "C" << (c == 1 ? "做了" : "没做") << "好事" << endl;
cout << "D" << (d == 1 ? "做了" : "没做") << "好事" << endl;
}
}
}
}
}
}
return 0;
}
1.本题讨论的对象,是他们自己本身 –> for循环的对象可知(本题for循环的对象为:是否为我做的好事) 2.限定了做好事的人数:一定要在写状态之前,添加if限制 3.题中告知了说真话的人数:相当于告知了输出前的if条件判断
枚举题型的一般方法: 第一步:枚举一下所有的状态(可能) 第二步:将所有状态,代入题设条件进行判断,得到bool值 第三步:将得到的bool值进行相与(或相加),根据题目所给的真话数量,输出合适的答案 若已知全部的话都是真话,则可以采用相与;否则采用相加然后和真话的数量比对