Java实现条件性参加会议问题(两种方法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SHYLOGO/article/details/77433956

有人邀请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

两种方法的对比,很明显卫条件非常好用!!!效率也高...
 

 


 

没有更多推荐了,返回首页