扑克序列

 A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
    要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。

    请填写出所有符合要求的排列中,字典序最小的那个。

例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。


请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。

这道题我只实现如何找出来所有满足的答案,不求出最小的字典排序。


思路:那就是依次放入,例如第一个空放入2,那么在1+2+1的位置上也要放一个2.

那么在第2个位置放上3 那么在2+3+1的位置上也要放下三

应该是一个递归,上代码。

	Set<Integer> set=new LinkedHashSet<Integer>();
	int array[];
	int book[];
	public static void main(String[] args){
		
		Test test=new Test();
		test.start();
		
	}
	
	public void start(){
		
		array=new int[8];
		book=new int[]{1,1,2,2,3,3,4,4};
		
		recursion(0,0);
		
	}
	
	public void recursion(int b,int index){
		
		if(b==8){
			
			
				System.out.println(Arrays.toString(array));
			
			
			
			
			
			return;
		}
		
		if(array[b]!=0){
			recursion(b+1,index);
			
			return;
		}
		
		for(int i=0;i<array.length;i++){
			
			if(book[i]!=0){
				//如果set集合里面含有了此书的价值,就不执行
				if(!set.contains(book[i])){
					
					set.add(book[i]);
					//在b位置放上book[i]的价值
					array[b]=book[i];
					
					if(b+book[i]+1>=book.length||array[b+book[i]+1]!=0){
						array[b]=0;
						set.remove(book[i]);
						continue;
					}
					//在另外一处放下book[i]的价值
					array[b+book[i]+1]=book[i];
					//book[i]=0证明这个价值已经放了进去
					book[i]=0;
					recursion(b+1,index+1);
					book[i]=array[b];
					array[b]=0;
					array[b+book[i]+1]=0;
					set.remove(book[i]);
				}
			}
		}
		
	}
	public boolean judge(int array[]){
		int a=0;
		for(int i=0;i<array.length;i++){
			if(array[i]==0){
				a++;
				
			}
		}
		if(a>1){
			return false;
		}else{
			return true;
		}
		
		
		
		
	}
今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。

这道题也是一样:

Set<Integer> set=new LinkedHashSet<Integer>();
	int array[];
	int book[];
	public static void main(String[] args){
		
		Test test=new Test();
		test.start();
		
	}
	
	public void start(){
		
		array=new int[14];
		book=new int[]{1,1,2,2,3,3,4,4,5,5,6,6,7,7};
		
		recursion(0);
		
	}
	
	public void recursion(int b){
		
		if(b==book.length){
			
			if(array[0]==7&&array[1]==4){
				System.out.println(Arrays.toString(array));
			}
			
			
			
			
			return;
		}
		
		if(array[b]!=0){
			recursion(b+1);
			
			return;
		}
		
		for(int i=0;i<array.length;i++){
			
			if(book[i]!=0){
				if(!set.contains(book[i])){
					set.add(book[i]);
					array[b]=book[i];
					
					if(b+book[i]+1>=book.length||array[b+book[i]+1]!=0){
						array[b]=0;
						set.remove(book[i]);
						continue;
					}
					array[b+book[i]+1]=book[i];
					book[i]=0;
					recursion(b+1);
					book[i]=array[b];
					array[b]=0;
					array[b+book[i]+1]=0;
					set.remove(book[i]);
				}
			}
		}
		
	}
	public boolean judge(int array[]){
		int a=0;
		for(int i=0;i<array.length;i++){
			if(array[i]==0){
				a++;
				
			}
		}
		if(a>1){
			return false;
		}else{
			return true;
		}
		
		
		
		
	}
	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值