問題
今有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