【蓝桥杯JavaB组真题详解】扑克序列(2014)

这篇博客探讨了一个扑克序列排列的数学问题,要求满足特定条件:AA223344,使得每对相邻的相同数字间插入相应数量的不同数字。作者使用了递归DFS算法进行求解,并给出了参考代码。最终找到了字典序最小的排列2342A3A4,并邀请读者分享其他可能的解法。
摘要由CSDN通过智能技术生成

题目描述

扑克序列
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行应该是少了个=

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疼疼蛇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值