算法训练 谁干的好事?
时间限制:1.0s 内存限制:256.0MB
问题描述
ABCDE中num个人做了好事,truth个人说真话。
A说:“我和X中有且只有一个做了好事”
B说:“C和E中有人做了好事”
C说:“我和D和A中有人做了好事”
D说:“B和C都没有做好事”
E说:“我没有做好事”
请问有哪些人做了好事?
多组方案请一行一个输出。
输入格式
仅一行,先是一个整数num,接着是一个A~E的字符X,最后是一个整数truth。意义见题面。
输出格式
每行输出一组方案,方案中按 字母序 输出做好事的人的代号(A~E),不要空格隔开。
如果没有合法方案,输出一行一个0即可。
样例输入
1 E 2
样例输出
0
样例输入
2 E 2
样例输出
BD
BE
数据规模和约定
规定,1 <= num <= 2。
#include <stdio.h>
int main()
{
int num, truth;
char X;
scanf("%d %c %d", &num, &X, &truth);
int sol = 0;
for (int i = 1; i <= 31; ++i)
{
int good[5] = { 0 };
int dump = i, count = 0;
for (int j = 4; j >= 0; --j)
{
good[j] = dump % 2;
if (good[j])
count++;
dump /= 2;
}
if (count != num)
continue;
int num_truth = 0;
if (good[4] ^ good[4 - (X - 'A')])
num_truth++;
if (good[2] || good[0])
num_truth++;
if (good[2] || good[1] || good[4])
num_truth++;
if (!good[3] && !good[2])
num_truth++;
if (!good[0])
num_truth++;
if (num_truth == truth)
{
sol++;
for (int j = 4; j >= 0; --j)
{
if (good[j])
printf("%c", 'A' + 4 - j);
}
printf("\n");
}
}
if (sol == 0)
printf("0");
return 0;
}