题目描述
某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
1)A和B两人中至少去一人;
2)A和D不能一起去;
3)A、E和F三人中要派两人去;
4)B和C都去或都不去;
5)C和D两人中去一个;
6)若D不去,则E也不去。
问应当让哪几个人去?
输入
无
输出
要派出的人
若有多个,按字母递增顺序排列,用逗号分开(含末尾逗号)
思路
每个人的状态为0(不去)或1(去)
则根据六个条件可得:
1、
- A = 1, B = 1
- A = 1, B = 0
- A = 0, B = 1
2、
- A = 1, D = 0
- A = 0, D = 1
- A = 0, D = 0
3、
- A = 1, E = 1, F = 0
- A = 1, E = 0, F = 1
- A = 0, E = 1, F = 1
4、
- B = 1, C = 1
- B = 0, C = 0
5、
- C = 1, D = 0
- C = 0, D = 1
6、
- D = 1, E = 1
- D = 1, E = 0
- D = 0, E = 0
因为要遍历A,B,C,D,E,F的两种状态,所以采用循环的形式
设置num作为当前遍历过的状态中去的人数最多的情况,并记录下当时A,B,C,D,E,F的状态
代码
#include<stdio.h>
int main()
{
int A = 0, B = 0, C = 0, D = 0, E = 0, F = 0;
int a, b, c, d, e, f;
int num = 0;
for(a = 0; a < 2; a++)
{
for(b = 0; b < 2; b++)
{
for(c = 0; c < 2; c++)
{
for(d = 0; d < 2; d++)
{
for(e = 0; e < 2; e++)
{
for(f = 0; f < 2; f++)
{
if(((a == 1 && b == 1) || (a == 1 && b == 0) || (a == 0 && b == 1)) &&
((a == 1 && d == 0) || (a == 0 && d == 1) || (a == 0 && d == 0)) &&
((a == 1 && e == 1 && f == 0) || (a == 1 && e == 0 && f == 1) || (a == 0 && e == 1 && f == 1)) &&
((b == 1 && c == 1) || (b == 0 && c == 0)) &&
((c == 1 && d == 0) || (c == 0 && d == 1)) &&
((d == 1 && e == 0) || (d == 1 && e == 1) || (d == 0 && e == 0)))
{
if(num < (a + b + c + d + e + f))
{
num = a + b + c + d + e + f;
A = a, B = b, C = c, D = d, E = e, F = f;
}
}
}
}
}
}
}
}
if(A == 1)
printf("A ");
if(B == 1)
printf("B ");
if(C == 1)
printf("C ");
if(D == 1)
printf("D ");
if(E == 1)
printf("E ");
if(F == 1)
printf("F");
return 0;
}