问题描述
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。
看了一会儿不会,,搜了一个dalao 的做法,。虽说暴力,,但是还是比较好理解的。。
因为数据规模num大于等于1,小于等于2.所以我们可以分成num=1,num=2这两种情况。
在这两种情况下,进一步分析可能的情况下,收到X的影响之后说真话的truth的情况。如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int num;
cin>>num;
string X;
cin>>X;
int truth;
cin>>truth;
set<string>s;
if (num==1){
if (truth==1){
if (X!="B"){
s.insert("B");
}
}
if(truth==2){
if (X=="B"){
s.insert("B");
} if (X!="E"){
s.insert("E");
}
}
if (truth==3){
if (X!="C"){
s.insert("C");
} if (X!="D"){
s.insert("D");
} if (X=="E"){
s.insert("E");
}
}
if (truth==4) {
s.insert("A");
if (X=="C"){
s.insert("C");
} if (X=="D"){
s.insert("D");
}
}
}
if (num==2){
if (truth==1){
if (X!="B"&&X!="E"){
s.insert("BE");
}
}
if (truth==2){
if (X=="B"){
s.insert("AB");
} if (X!="B"&&X!="D"){
s.insert("BD");
} if (X=="B"||X=="E"){
s.insert("BE");
} if ((X!="E")&&(X!="C")){
s.insert("CE");
}
}
if (truth==3) {
if (X=="E"){
s.insert("AE");
} if (X!="B"){
s.insert("AB");
} if (X=="C"){
s.insert("AC");
}if (X=="D"){
s.insert("AD");
}if (X!="E"){
s.insert("AE");
} if (X!="B"&&X!="C"){
s.insert("BC");
} if (X=="B"||X=="D"){
s.insert("BD");
} if (X!="D"&&X!="C"){
s.insert("CD");
} if (X=="C"||X=="E"){
s.insert("CE");
} if (X!="D"&&X!="E"){
s.insert("DE");
}
}
if (truth==4){
if (X!="C"){
s.insert("AC");
} if (X!="D"){
s.insert("AD");
} if (X=="B"||X=="C"){
s.insert("BC");
} if (X=="C"||X=="D"){
s.insert("CD");
}if (X=="C"||X=="E"){
s.insert("DE");
}
}
}
if (s.size()==0)
puts("0");
for (set<string>::iterator it=s.begin();it!=s.end();it++){
cout<<*it<<endl;
}
return 0;
}