天天看點

Java實作條件性參加會議問題(兩種方法)

有人邀請A,B,C,D,E,F 6個人參加一項會議,這6個人有些奇怪,因為他們有很多要求,已知:

  1)A,B兩人至少有1人參加會議;

  2)A,E,F 3人中有2人參加會議;

  3)B和C兩人一緻決定,要麼兩人都去,要麼兩人都不去;

  4)A,D兩人中隻1人參加會議;

  5)C,D兩人中也隻要1人參加會議;

  6)如果D不去,那麼E也決定不去。

那麼最後究竟有哪幾個人參加了會議呢?

方法一:暴力列舉

package String;

public class Meeting_1 {

  public static void main(String[] args) {
             for(int a1=0;a1<=1;a1++){  //0表示不去,1表示去
               for(int a2=0;a2<=1;a2++){
                 for(int a3=0;a3<=1;a3++){
                   for(int a4=0;a4<=1;a4++){
                     for(int a5=0;a5<=1;a5++){
                       for(int a6=0;a6<=1;a6++){
                         if(tem1(a1,a2,a3,a4,a5,a6)&&
                             tem2(a1,a2,a3,a4,a5,a6)&&
                             tem3(a1,a2,a3,a4,a5,a6)&&
                             tem4(a1,a2,a3,a4,a5,a6)&&
                             tem5(a1,a2,a3,a4,a5,a6)&&
                             tem6(a1,a2,a3,a4,a5,a6)
                             ){
                           System.out.println("a1 "+a1);
                           System.out.println("a2 "+a2);
                           System.out.println("a3 "+a3);
                           System.out.println("a4 "+a4);
                           System.out.println("a5 "+a5);
                           System.out.println("a6 "+a6);
                         }
                         
                       }
                     }
                   
                   }
                 }
               }
             }
  }

  private static boolean tem6(int a1, int a2, int a3, int a4, int a5, int a6) { //如果D不去,那麼E也決定不去。
      
    if(a4==0){
      if(a5==0){
        return true;
      }
      return false;
    }    
    return false;
  }

  private static boolean tem5(int a1, int a2, int a3, int a4, int a5, int a6) { //C,D兩人中也隻要1人參加會議;

    if((a3+a4)==1){
      return true;
    }
    
    return false;
  }

  private static boolean tem4(int a1, int a2, int a3, int a4, int a5, int a6) { //A,D兩人中隻1人參加會議;
     
    if((a1+a4)==1){
      return true;
    }    
    return false;
  }

  private static boolean tem3(int a1, int a2, int a3, int a4, int a5, int a6) {// B和C兩人一緻決定,要麼兩人都去,要麼兩人都不去;
    if((a2+a3)==2||(a2+a3)==0){
      return true;
    }    
    return false;
  }

  private static boolean tem2(int a1, int a2, int a3, int a4, int a5, int a6) {// A,E,F 3人中有2人參加會議;
    
    if((a1+a5+a6)==2){
      return true;
    }
    return false;
  }

  private static boolean tem1(int a1, int a2, int a3, int a4, int a5, int a6) { // A,B兩人至少有1人參加會議
    
    if((a1+a2)==1||(a1+a2)==2){
      return true;
    }    
    return false;
  }
}      

測試結果:

a1 1
a2 1
a3 1
a4 0
a5 0
a6 1      

方法二:衛條件

package String;

public class Meting_2 {

  // 暴力搜尋
  public static void main(String[] args) {
    for (int a1 = 0; a1 <= 1; a1++) { // 0表示不去,1表示去
      for (int a2 = 0; a2 <= 1; a2++) {
        for (int a3 = 0; a3 <= 1; a3++) {
          for (int a4 = 0; a4 <= 1; a4++) {
            for (int a5 = 0; a5 <= 1; a5++) {
              for (int a6 = 0; a6 <= 1; a6++) {
                if (teml(a1, a2, a3, a4, a5, a6)) {
                  System.out.println("a1 " + a1);
                  System.out.println("a2 " + a2);
                  System.out.println("a3 " + a3);
                  System.out.println("a4 " + a4);
                  System.out.println("a5 " + a5);
                  System.out.println("a6 " + a6);
                }

              }
            }

          }
        }
      }
    }

  }

  private static boolean teml(int a1, int a2, int a3, int a4, int a5, int a6) {
    // 衛條件
    if (!(a1 + a2 >= 1)) {
      return false;
    }
                 //條件2
    if (a1 + a5 + a6 != 2) {
      return false;
    }
    // 條件3
    if (a2 + a3 == 1) {
      return false;
    }
                //條件4
    if (a1 + a4 != 1) {
      return false;
    }
                //條件5
    if (a3 + a4 != 1) {
      return false;
    }
                //條件6
    if (a4 == 0) {
      if (a5 == 1) {
        return false;
      }
    }
    return true;
  }
}      

測試結果:

a1 1
a2 1
a3 1
a4 0
a5 0
a6 1