2014蓝桥杯JAVAB组-扑克序列

题干:

A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
    要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
 
    请填写出所有符合要求的排列中,字典序最小的那个。
 
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。

 这题也没什么好的办法,只能穷举,但是可以做些剪枝(不知道算不算)简化一下

思路就是按照正常的逻辑对扑克按要求进行排列,先对A分配位置,放在第一个位置,那第三个位置也是A,再对2分配位置,放在第一个位置不行,往后,放在第二个位置,第5个位置也是2……

思路还是很简单的,就是代码中判断位置是否冲突越来越麻烦

public class PukeXulie {

    public static void main(String[] args){

        /*
        * 按照正常的排列组合方式穷举
        * */

        char[] chars = new char[8];

        for(int ma = 0; ma < 6; ma ++){     //第一个A最靠右也只能放到第6个,因为中间要插一张,后边还要跟张A
            chars[ma] = 'A';
            chars[ma + 2] = 'A';
            for(int m2 = 0; m2 < 5; m2 ++){     //同理,第一张2在最靠右只能放到第5张,最后一张放2,中间还要插两张
                if(ma == m2 || ma+2 == m2+3 || ma == m2+3 || ma+2 == m2){       //如果2的位置与A相同,跳过
                    continue;       // break是跳过整个循环,continue是跳过一次循环
                }
                else{
                    chars[m2] = '2';
                    chars[m2+3] ='2';
                    for(int m3 = 0; m3 < 4; m3 ++){
                        if(m3 == ma || m3 == ma+2 || m3 == m2 || m3 == m2+3 || 
                            m3+4 == ma || m3+4 == ma+2 || m3+4 == m2 || m3+4 == m2+3){
                            continue;
                        }
                        else{
                            chars[m3] = '3';
                            chars[m3+4] = '3';
                            for(int m4 = 0; m4 < 3; m4++){
                                if(m4 == ma || m4 == ma+2 || m4 == m2 || m4 == m2+3 || 
                                    m4 ==m3 || m4 == m3+4 ||m4+5 == ma || m4+5 == ma+2 || 
                                    m4+5 == m2 ||m4+5 == m2+3 || m4+5 == m3 || m4+5 == m3+4){
                                    continue;
                                }
                                else{
                                    chars[m4] = '4';
                                    chars[m4+5] ='4';
                                    for(int i = 0; i < chars.length; i++){
                                        System.out.print(chars[i]);
                                    }
                                    System.out.println();
                                }
                            }
                        }
                    }
                }

            }
        }

    }

}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值