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也决定不去。
 那么最后究竟有哪几个人参加了会议呢?
 */


可变参数必须位于最后一项。当可变参数个数多于一个时,必将有一个不是最后一项,所以只支持有一个可变参数。

可变参数的书写形式如:
void a(boolean a,int ...args){  方法体 }

1)必须是三点;

2)... 位于变量类型和变量名之间,前后有无空格都可以;
3)可变参数的应用实际上是java虚拟机动态的开了一个数组;

4)三点后不能再加其他东西。

package cn.hncu.p37.meeting;

public class Meeting1 {
	public static void main(String[] args) {
		for (int a1 = 1; a1 <= 2; a1++) {
			for (int a2 = 1; a2 <= 2; a2++) {
				for (int a3 = 1; a3 <= 2; a3++) {
					for (int a4 = 1; a4 <= 2; a4++) {
						for (int a5 = 1; a5 <= 2; a5++) {
							for (int a6 = 1; a6 <= 2; a6++) {
								if (ok(a1, a2, a3, a4, a5, a6)) {
									System.out.println("a1--"+a1+
											"\na2--"+a2+
											"\na3--"+a3+
											"\na4--"+a4+
											"\na5--"+a5+
											"\na6--"+a6
														);
									break;
								}
							}
						}
					}
				}
			}
		}
		//类似上面6个for
		//for (int i = 0; i <= 63; i++) {//二进制表示六个人( 000000 ~ 111111  )去还是不去  1表示去 ,0表示不去
			//a = ((i & 1) == 0) ? 0 : 1;
			//b = ((i & 2) == 0) ? 0 : 1;
			//c = ((i & 4) == 0) ? 0 : 1;
		//	d = ((i & 8) == 0) ? 0 : 1;
			//e = ((i & 16) == 0) ? 0 : 1;
		//	f = ((i & 32) == 0) ? 0 : 1;
			//if (fun(a, b, c, d, e, f)) {
			//	System.out.println("a= " + a + " b= " + b + " c= " + c + " d= "
			//			+ d + " e= " + e + " f= " + f);
			//}
		//}
	}

	private static boolean ok(int a1, int a2, int a3, int a4, int a5, int a6) {
		if (!(countGo(a1, a2) >= 1)) {// A,B两人至少有1人参加会议;
			return false;
		}
		if (!(countGo(a1, a5, a6) == 2)) {// A,E,F 3人中有2人参加会议;
			return false;
		}
		if (!(countGo(a2, a3) == 2 || countGo(a2, a3) == 0)) {// B和C两人一致决定,要么两人都去,要么两人都不去;
			return false;
		}
		if (!(countGo(a1, a4) == 1)) {// A,D两人中只1人参加会议;
			return false;
		}
		if (!(countGo(a3, a4) == 1)) {// C,D两人中也只要1人参加会议;
			return false;
		}
		if (countGo(a4) == 0 && countGo(a5) == 1) {// 如果D不去,那么E也决定不去。
			return false;
		}
		return true;
	}

	private static int countGo(int... mee) {
		int count = 0;
		for (int me : mee) {
			if (me == 1) {
				count++;
			}
		}
		return count;
	}

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值