扑克序列
A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。
思路
按照字典序大小全排列,检查并输出第一个符合条件的排列。
import java.util.Arrays;
public class 扑克序列 {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] data = { 'A', 'A', '2', '2', '3', '3', '4', '4' };
char[] arr = new char[data.length];
Arrays.sort(data);
dfs(arr, data, 0);
}
// 按字典序大小全排列输出
private static void dfs(char[] arr, char[] data, int cur) {
if (cur == arr.length) {
if (check(arr)) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.exit(0);
}
return;
}
// 尝试将data[i]放进arr[cur]位置
for (int i = 0; i < data.length; i++) {
// 检查是否在arr中出现了两次
int count = 0;
for (int j = 0; j < cur; j++) {
if (data[i] == arr[j]) {
count++;
}
}
if (count < 2) {
arr[cur] = data[i];
dfs(arr, data, cur + 1);
}
}
}
private static boolean check(char[] arr) {
int l = 0;
int r = arr.length - 1;
int len = 0;
while (arr[l]!='A'||arr[r]!='A') {
if (arr[l] != 'A') {
l++;
}
if (arr[r] != 'A') {
r--;
}
len = r - l - 1;
}
if (len != 1) {
return false;
}
l = 0;
r = arr.length - 1;
len = 0;
while (arr[l]!='2'||arr[r]!='2') {
if (arr[l] != '2') {
l++;
}
if (arr[r] != '2') {
r--;
}
len = r - l - 1;
}
if (len != 2) {
return false;
}
l = 0;
r = arr.length - 1;
len = 0;
while (arr[l]!='3'||arr[r]!='3') {
if (arr[l] != '3') {
l++;
}
if (arr[r] != '3') {
r--;
}
len = r - l - 1;
}
if (len != 3) {
return false;
}
l = 0;
r = arr.length - 1;
len = 0;
while (arr[l]!='4'||arr[r]!='4') {
if (arr[l] != '4') {
l++;
}
if (arr[r] != '4') {
r--;
}
len = r - l - 1;
}
if (len != 4) {
return false;
}
return true;
}
}