题目描述
扑克序列
A A 2 2 3 3 4 4, 一共 4 对扑克牌。请你把它们排成一行。
要求:两个 A 中间有 1 张牌,两个 2 之间有 2 张牌,两个 3 之间有 3 张牌,两个 4 之间有 4 张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。·
解题思路
我的思路是
将A的坐标记作a,a+2;
将2的坐标记作b,b+3;
将3的坐标记作c,c+4;
将4的坐标记作d,d+5;
然后排列组合去掉占重复坐标的情况,得到答案,一个答案有两种情况,正序和反序都列出来
参考代码
import java.util.Arrays;
public class Main {
static char[] arr=new char [8];
public static void main(String[] args) {
dfs();
}
/*
* 第一个A下标为a,第二个A下标为a+2;
* 第一个2下标为b,第二个2下标为b+3;
* 第一个3下标为c,第二个3下标为c+4;
* 第一个4下标为d,第二个4下标为d+5;
*/
public static void dfs() {
for(int a=1;a<=6;a++) {
for(int b=1;b<=5;b++) {
for(int c=1;c<=4;c++) {
for(int d=1;d<=3;d++) {
String str = ""+a+b+c+d+(a+2)+(b+3)+(c+4)+(d+5);
boolean flag = true;
String [] getString = str.split("");
Arrays.sort(getString);
for(int i=0;i<getString.length-1;i++) {
if(getString[i].equals(getString[i+1])) {
flag = false;
break;
}
}
if(flag) {
arr[a-1]=arr[a+1]='A';
arr[b-1]=arr[b+2]='2';
arr[c-1]=arr[c+3]='3';
arr[d-1]=arr[d+4]='4';
for(int i=arr.length-1;i>=0;i--) {
System.out.print(arr[i]);
}
System.out.println();
}
}
}
}
}
}
}
运行结果
2342A3A4
4A3A2432
答案
取2342A3A4
有其他更好的解法欢迎在评论区分享噢!
感谢博主Zhang_ing提供的建议,原代码18行应该是少了个=