题干:
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();
}
}
}
}
}
}
}
}
}