2014年第五届蓝桥杯JavaB组省赛试题解析第七题 扑克排序

package lianxi;
import java.util.Arrays;
import java.util.HashSet;
import java.util.TreeSet;
public class g {
	 // 题目:
	 // A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。 
	 // 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
	 // 请填写出所有符合要求的排列中,字典序最小的那个。
	 // 例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
	 // 请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格
     //特点:字符串带重  1全排列去重  2筛选约束条件并输出
	public static void main(String[] args) {
	 char[] str = { 'A', 'A', '2', '2', '3', '3', '4', '4' };
	fullsort(str,0,str.length-1);
	//筛选约束条件
		  System.out.println(hs.first());      
	}
static TreeSet <String> hs=new TreeSet<>();
//定义一个函数来判断约束条件
public static boolean check(String s)
{
	if(s.lastIndexOf("A") - s.indexOf("A") == 2 && s.lastIndexOf("2") - s.indexOf("2") == 3
            && s.lastIndexOf("3") - s.indexOf("3") == 4 && s.lastIndexOf("4") - s.indexOf("4") == 5)
{
return true;
}
	return false;
}

//全排列函数并去重
public static void fullsort(char[] str,int start,int end)
{
	if(start==end)
	{
		 String s = new String(str);
		if(check(s))
		{
			//System.out.print(s);
		    hs.add(s);		
		}
	//hs.add(Arrays.toString(str));
	}
	else
	{
		for(int i=start;i<=end;i++)
		{
			swap(str,i,start);
			fullsort(str,start+1,end);
			swap(str,i,start);
		}
	}
}
//定义一个交换函数
public static void swap(char[] str,int i,int j)
{
	char tmp=str[i];
	str[i]=str[j];
	str[j]=tmp;
}
}

你可能感兴趣的:(2014年第五届蓝桥杯JavaB组省赛试题解析第七题 扑克排序)