有人邀请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也决定不去。
那么最后究竟有哪几个人参加了会议呢?
1)A,B两人至少有1人参加会议;
2)A,E,F 3人中有2人参加会议;
3)B和C两人一致决定,要么两人都去,要么两人都不去;
4)A,D两人中只1人参加会议;
5)C,D两人中也只要1人参加会议;
6)如果D不去,那么E也决定不去。
那么最后究竟有哪几个人参加了会议呢?
六个人,使用a1,a2,a3,a4,a5,a6来表示,暴力法就可以解决了。主要是卫条件的使用。
public class Meeting {
public static void main(String[] args) {
//1代表去,2代表不去
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( t(a1,a2,a3,a4,a5,a6) ){
System.out.println("a1="+a1+",a2="+a2+",a3="+a3+",a4="+a4+",a5="+a5+",a6="+a6);
}
}
}
}
}
}
}
}
//统计去的人数
private static int countGo(int...as){
int sum=0;
for(int a: as){
if(a==1){
sum++;
}
}
return sum;
}
//卫条件,反逻辑
static boolean t(int a1, int a2, int a3, int a4, int a5, int a6){
//条件1--卫条件--卫兵
if(countGo(a1,a2)<1){
return false;
}
//2
if( countGo(a1,a5,a6)!=2 ){
return false;
}
//3
if( countGo(a2,a3)==1 ){
return false;
}
//4
if( countGo(a1,a4)!=1 ){
return false;
}
//5
if( countGo(a3,a4)!=1 ){
return false;
}
//6
if( countGo(a4)==0 && countGo(a5)==1){
return false;
}
//如果程序能够到达这里,说明前面的6个条件都满足,就可以认为是答案了
return true;
}
}