题目
A、B、C、D、E、F、G、H、I、J
0、1、2、3、4、5、6、7、8、9
共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束:
false分析
1. 如果A参加,B也参加; A&&!B
2. 如果C不参加,D也不参加; !C&&D
3. A和C中只能有一个人参加; A+C>1
4. B和D中有且仅有一个人参加; B+D!=1
5. D、E、F、G、H 中至少有2人参加; D+E+F+G+H<2
6. C和G或者都参加,或者都不参加; C!=G
7. C、E、G、I中至多只能2人参加 C+E+G+I>2
8. 如果E参加,那么F和G也都参加。 E&&!(F&&G)
9. 如果F参加,G、H就不能参加 F&&(G||H)
10. 如果I、J都不参加,H必须参加 !I&&!J&&!H
请编程根据这些条件判断这10名同学中参赛者名单。如果有多种可能,则输出所有的可能情况。每种情况占一行。参赛同学按字母升序排列,用空格分隔。
比如:
C D G J
就是一种可能的情况。多种情况的前后顺序不重要
最重要的还是仔细分析题目吧!!!没有什么其他好方法
太久没写代码了,这个一开始没想好,拖了很久。。。其实就是把false分析写好就行了,我不知道答案对不对。。。
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const double eps=3e-8;
const int mod=10;
const int maxn=2e5;
bool vis[11];
bool judge(){
if(vis[0]&&!vis[1])return false;
if(!vis[2]&&vis[3])return false;
if(vis[0]+vis[2]>1)return false;
if(vis[1]+vis[3]!=1)return false;
if(vis[3]+vis[4]+vis[5]+vis[6]+vis[7]<2)return false;
if(vis[2]!=vis[6])return false;
if(vis[2]+vis[4]+vis[6]+vis[8]>2)return false;
if(vis[4]&&!(vis[5]&&vis[6]))return false;
if(vis[5]&&(vis[6]||vis[7]))return false;
if(!vis[8]&&!vis[9]&&!vis[7])return false;
return true;
}
int main(){
for(int i=0;i<1024;i++){
int temp=i;
for(int j=9;j>=0;j--){
vis[j]=temp%2;
temp=temp/2;
}
if(judge()){
//printf("Yes\t");
for(int j=0;j<10;j++){
if(vis[j])printf("%c",('A'+j));
}
printf("\n");
}
}
return 0;
}