问题
今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:
17126425374635
当然,如果把它倒过来,也是符合要求的。
请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。
注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。
思路
按照题意来说就是,将剩下的1,2,3,5,6填入到74xxxx4x7xxxxx中。
因为这是一个有解的问题。所以每一个数字都会有其位置。通过遍历每一个空位,来寻找合适的解。
通过深搜来寻找指定的位置,当位置不符合要求就回退到上一种情况。
代码
public class Demo_FillNumber {
public static void solve_1(){
int[] arr = new int[14]; //将数放在数组中
arr[0] = arr[8] = 7;
arr[1] = arr[1+4+1] = 4;
int[] Nums = {1,2,3,5,6}; //将存放的数放在一起
assist_1(arr,Nums,0);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
//深度优先搜索(每一个assist_1都是为t找到放在数组合适的位置)
public static boolean assist_1(int arr[],int nums[],int t){
if(t>= nums.length){
return true;
}
//给t找到第一个适合的位置,递归assist_1(t+1)。
// 若不成功代表当前t的位置不合法,找下一个合适的位置
for (int j = 2; j < arr.length; j++) {
if(j+nums[t]+1 < arr.length && arr[j] == 0&& arr[j+nums[t]+1] == 0){
arr[j] = arr[j+nums[t]+1] = nums[t];
if(assist_1(arr,nums,t+1)){ //找到了合适的位置就返回true,返回到上一层找t对应的位置,否则就找下一个合适的位置
return true;
}
arr[j] = arr[j+nums[t]+1] = 0;//不合适,赋值为0
}
}
return false;
}
public static void main(String[] args) {
solve_1();
}
}
答案为:74151643752362