博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
受约束的10人参赛问题
阅读量:5114 次
发布时间:2019-06-13

本文共 1735 字,大约阅读时间需要 5 分钟。

A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。

因为某种原因,他们是否参赛受到下列条件的约束:

   1. 如果A参加,B也参加;

   2. 如果C不参加,D也不参加;

   3. A和C中只能有一个人参加;

   4. B和D中有且仅有一个人参加;

   5. D、E、F、G、H 中至少有2人参加;

   6. C和G或者都参加,或者都不参加;

   7. C、E、G、I中至多只能2人参加  

   8. 如果E参加,那么F和G也都参加。

   9. 如果F参加,G、H就不能参加

   10. 如果I、J都不参加,H必须参加

请编程根据这些条件判断这10名同学中参赛者名单。如果有多种可能,则输出所有的可能

情况。每种情况占一行。参赛同学按字母升序排列,用空格分隔。

比如:

C D G J

就是一种可能的情况。

//该题的关键还在于如何枚举10个数,可以10重for循环,也可以类似素数环进行回溯,或者二进制枚举

 #include
 #include
 using namespace std;
 
 int vis[11] = {0};
 
 //vis若是bool 变不可写成两数相加减
 bool judge()
 {
      //a推出(蕴含)b,等价于(非a或b);或者a ==1&&b==1||a==0,等价于a==0||b==1,此次用到了短路表达式的性质
      bool t1 = (vis[0]== 0||vis[1] == 1);
      //类似第一个;或者c==0&&d==0||c=1
      bool t2 =( vis[2] == 1||vis[3] == 0);
      //从第四个条件可以看出这个包含都不参加的情况,等价于都不参加或者只参加一个人,反面是两个人都参加,再取反 !(a==1&&c==1)等价于a==0||c==0,转化为a+c<=1
      bool t3 = ((vis[0] + vis[2])<=1);//或者等于0
      //反面是同时参加或者同时不参加,再取反!(b==d),等价于b+d ==1
      bool t4 = (vis[1] + vis[3]==1);
      bool t5 = ((vis[3] + vis[4] + vis[5] + vis[6] + vis[7]) >=2);
      //c==g,可化为就、相加为0或者2
      bool t6 = (vis[2] == vis[6]);
      bool t7 = ((vis[2]+vis[4]+vis[6]+vis[8])<=2);
      //类似第一个
      bool t8 = (vis[4] == 0||(vis[5] + vis[6] == 2));
      bool t9 = vis[5]==0||(vis[6]+vis[7]==0);
      //(i ==0&&j==0)&&h==1||(ij至少一人参加),等价于(i==1||j==1)||h==1
      bool t10 = (vis[8]+vis[9]>0)||vis[7]==1;
      return t1&&t2&&t3&&t4&&t5&&t6&&t7&&t8&&t9&&t10;
 }
 void print()
 {
      int i,j,k;
      for(i=0; i<10; i++)
           if(vis[i]>0)//若vis是bool,所以不可写成vis[i]>0
           {
                char ch = i + 'A';
                cout<<ch<<" ";
           }
 }
 int main()
 {
      int i,j,k;
      //二进制枚举比递归回溯好理解
      //二进制枚举,两数的与或疑惑分别表示集合的交并对称差
      int total = 0;//
      memset(vis,0,sizeof(vis));
      while(total<1024)//用total的前十位表示参加状态,1024并不是来自1<<10,而是十个1表示(1<<10-1)
      {
           total++;//不可能全都不参加,所以先自增了
           for(i=0; i<10; i++)//用total的底10为表示状态,或者total按求余法求的底十位
           {
      

转载于:https://www.cnblogs.com/liuzhuqing/archive/2012/12/27/7480668.html

你可能感兴趣的文章
对Java前四章的感受
查看>>
【Linux】ping命令详解
查看>>
对团队成员公开感谢博客
查看>>
密码学总结
查看>>
java学习第三天
查看>>
jq 通配符,模糊查询
查看>>
python目录
查看>>
django+uwsgi+nginx+sqlite3部署+screen
查看>>
Andriod小型管理系统(Activity,SQLite库操作,ListView操作)(源代码下载)
查看>>
在Server上得到数据组装成HTML后导出到Excel。两种方法。
查看>>
浅谈项目需求变更管理
查看>>
经典算法系列一-快速排序
查看>>
设置java web工程中默认访问首页的几种方式
查看>>
ASP.NET MVC 拓展ViewResult实现word文档下载
查看>>
jQuery Mobile笔记
查看>>
8、RDD持久化
查看>>
第二次团队冲刺--2
查看>>
查询数据(后台到前台传递数据,显示数据)
查看>>
集群tomcat+apache配置文档
查看>>
VMware Tools安装
查看>>