类抽屉问题的C++解决

问题如下
  A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
  人参加了竞赛:
   (1)A参加时,B也参加;
   (2)B和C只有一个人参加;
   (3)C和D或者都参加,或者都不参加;
   (4)D和E中至少有一个人参加;
   (5)如果E参加,那么A和D也都参加。

这种应该是抽屉问题吧,呵呵,小学时数学竞赛好像看过,不知道术语对不对。。用代码实现。
遗留一个问题点就是程序里用的那几个for循环,看着太多了,很不舒服,可一时也不知道怎么处理。。

  1. //example 1-1
  2. #include <iostream>
  3. using namespace std;
  4. //enum persion{A,B,C,D,E};
  5. bool checkuser(bool a,
  6.                bool b,
  7.                bool c,
  8.                bool d,
  9.                bool e) 
  10. {
  11.     //when a  go,so do b
  12.     if(a)
  13.     {
  14.         if(!b)
  15.         {
  16.             return false;
  17.         }
  18.     }
  19.     
  20.     //between b and c , only one can go
  21.     if(b && c){return false;}
  22.     
  23.     //c and d,their go together
  24.     if(c != d){return false;}
  25.     
  26.     //d and e,one should go at least
  27.     if(!d || e){return false;}
  28.     
  29.     //if e go,a and d alse go
  30.     if (e)
  31.     {
  32.         if (!a && d)
  33.         {
  34.             return false;
  35.         }
  36.     }
  37.     return true;
  38.    
  39. }
  40. void output(bool a,
  41.             bool b,
  42.             bool c,
  43.             bool d,
  44.             bool e)  
  45. {
  46.     a?cout<<"A参加します"<<endl:cout<<"A参加していません"<<endl;
  47.     b?cout<<"B参加します"<<endl:cout<<"B参加していません"<<endl;
  48.     c?cout<<"C参加します"<<endl:cout<<"C参加していません"<<endl;
  49.     d?cout<<"D参加します"<<endl:cout<<"D参加していません"<<endl;
  50.     e?cout<<"E参加します"<<endl:cout<<"E参加していません"<<endl;
  51. }
  52. int main()
  53. {
  54.     for(int aa = 0; aa < 2; aa++)
  55.     {
  56.         for(int bb = 0; bb <=1; bb++)
  57.         {
  58.             for(int cc = 0; cc <=1; cc++)
  59.             {
  60.                 for(int dd = 0; dd <=1; dd++)
  61.                 {
  62.                     for(int ee = 0; ee <=1; ee++)
  63.                     {
  64.                         bool a = (aa == 1)?true:false;
  65.                         bool b = (bb == 1)?true:false;
  66.                         bool c = (cc == 1)?true:false;
  67.                         bool d = (dd == 1)?true:false;
  68.                         bool e = (ee == 1)?true:false;
  69.  
  70.                         if(checkuser(a, b, c ,d ,e))
  71.                         {
  72.                             output(a, b, c ,d ,e);
  73.                         }
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.     }
  79.     
  80.     system("pause");
  81.     return 0;
  82. }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值