一道竞赛题

/**

* A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束
* 1. 如果A参加,B也参加;
* 2. 如果C不参加,D也不参加;
* 3. A和C中只能有一个人参加;
* 4. B和D中有且仅有一个人参加;
* 5. D、E、F、G、H 中至少有2人参加;
* 6. C和G或者都参加,或者都不参加;
* 7. C、E、G、I中至多只能2人参加

* 8. 如果E参加,那么F和G也都参加。 

* 9. 如果F参加,G、H就不能参加
* 10. 如果I、J都不参加,H必须参加

* 打印所有满足条件的情况~

*/

我的思路是:

10名同学,每人要么参加,要么不参加,所以一共有2的10次方即1024种的可能性,

那么我们可以用0到1024的二进制表示所有可能,如11 1111 1111 表示所有同学都参加了,

我们然后遍历所有可能,进行筛选,最后将结果转换成字符

 

代码如下:

 

public static void main(String[]args){
        List<Integer> list = new ArrayList<Integer>();
        for(int i=0;i<1024;i++){    
            if(((i>>9)&1)==1&&((i>>8)&1)!=1){
                continue;
            }
            if(((i>>7)&1)==0&&((i>>6)&1)!=0){
                continue;
            }
            if(((i>>9)&1)*((i>>7)&1)==1){
                continue;
            }
            if((((i>>8)&1)+((i>>6)&1))==0||(((i>>8)&1)+((i>>6)&1))==2){
                continue;
            }
            if((((i>>6)&1)+((i>>5)&1)+((i>>4)&1)+((i>>3)&1)+((i>>2)&1))<2){
                continue;
            }
            if((((i>>7)&1)+((i>>3)&1))==1){
                continue;
            }
            if(((i>>5)&1)==1&&(((i>>4)&1)==0||((i>>3)&1)==0)){
                continue;
            }
            if(((i>>4)&1)==1&&(((i>>3)&1)==1|((i>>2)&1)==1)){
                continue;
            }
            if(((i>>6)&1)==0&&((i>>6)&1)==0&&((i>>6)&1)==0){
                continue;
            }
            list.add(i);
            
        }
        System.out.println("size()======"+list.size());
        for(int i=0;i<list.size();i++){
            String s = Integer.toBinaryString((Integer) list.get(i));
            for(int j=9;j>-1;j--){
                if(((list.get(i)>>j)&1)==1){
                    System.out.print((char)('I'-j+1));
                }
            }
            System.out.println();
        }    
    }

 

 运行结果:

size()======8
CDG
CDGJ
CDGI
CDGIJ
CDGH
CDGHJ
CDGHI
CDGHIJ

 

如果有其他好方法,欢迎分享~

 

posted on 2014-07-28 14:45  asonga  阅读(238)  评论(1编辑  收藏  举报

导航