java蓝桥杯第五届省赛数字排序问题

本文介绍了一个有趣的数学问题:如何寻找一组数字排列,使得每对相同的数字之间恰好包含一定数量的其他数字。通过递归深度优先搜索算法,文章提供了一种解决方案,并展示了所有可能的排列组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:
17126425374635
当然,如果把它倒过来,也是符合要求的。

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


解题思路:

假如数组中第i个位置放数字n,则第i+n+1个位置也应该放数字n,因此初始条件下第1和第9的位置为7,第2和第7的位置为4,初始化时应该写入。

定义一个数组,里面元素为1,2,3,5,6,即还未用到的数字。再定义一个标志数组(boolean),表示某个数字是否已经用过。

以下是输出满足条件的全部结果:

import java.util.ArrayList;
import java.util.List;


public class Test {
	static int[] b = new int[]{1,2,3,4,5,6,7};  //需要填入的数字
	static int[] a = new int[15];   //最终数组
	static boolean[] flag = new boolean[10];  //标志数组
	static List<String> list = new ArrayList<>();  //存储结果
	public static void main(String[] args) {
		dfs(0);
		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}
		System.out.println(list.size());
	}
	
	static void dfs(int n){
		if(n==7){   //n=7时所有数字都已经填写完毕
			String s = "";
			for(int i=1;i<15;i++){
				s+=a[i];
			}   //删除逆序之后相同的结果
			if(!list.contains(s)&&!list.contains(new StringBuffer(s).reverse().toString()))
				list.add(s);
			return ;
		}
		
		for(int i=0;i<7;i++){
			if(!flag[b[i]]){  //数字b[i]还没有填入
				for(int j=1;j<15;j++){
					if(a[j]==0&&j+b[i]+1<15&&a[j+b[i]+1]==0){ //位置j及数字b[i]对应位置都没有填入数字
						a[j] = b[i];
						a[j+b[i]+1] = b[i];
						flag[b[i]] = true;  //修改标志位
						dfs(n+1);
						flag[b[i]] = false; //回溯
						a[j+b[i]+1] = 0;
						a[j] = 0;
					}
				}
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值