算法系列之遞歸函數(七位數字)

七對數字

今有兩個1,兩個2,兩個3,...兩個7,把它們排成一行。
要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是一個符合要求的排列:

17126425374635

當然,如果把它倒過來,也是符合要求的。

請你找出另一種符合要求的排列法,並且這個排列法是以74開頭的。

注意:只填寫這個14位的整數,不能填寫任何多餘的內容,比如說明註釋等。

說明:這道題是2015年的藍橋杯題目,很巧妙的一道題。

思路:

有很多小夥伴第一想到的是聲明一個二維數組,以鍵值對的方式存放1-7這14個數字,

其實小編覺得這種方法並沒有錯,只是相對來說比較麻煩而已,

只要把1-7這7個數字放在一個一維數組裏面就可以了,設置的時候,

只需要把這個位置和這個位置後面i個數的位置也設置爲這個數就可以了,

這樣就一次性用掉了兩個同樣的數組,當然本題的核心還是遞歸算法的巧妙運用,

下面的代碼小編注釋寫的相對來說比較明確,

希望小夥伴們能夠看懂,如果看不懂,評論區等着大家哦~

源代碼:

package 第六屆藍橋杯;

public class 數字7對 {
//判斷1~7這個數組是否被訪問了。
public static boolean vis[]=new boolean[8];
//用於存放14個數的數組
public static int ten[]=new int[14];
public static void main(String[] args) {
f(0);
}
public static void f(int b){
/*for(int i=0;i<14;i++){
int j=1;
ten[i]=j;
ten[j+2]=j;
} */
if(b==14){ //達到14位數字進行
for(int i=0;i<14;i++){
System.out.print(ten[i]);
}
System.out.println("");
return;
}
//判斷ten[b]這個位置是否等於0,不等於的話,說明已經賦值了,跳到下一個
if(ten[b]!=0){
f(b+1);
return;//進行回溯
}
else{
//如果等於0,說明還沒有賦值,從1~7的數字中進行選值進行賦值
for(int i=1;i<=7;i++){
//還要考慮到1~7選的值是否被調用了並且i+b+1的位置應該爲0
//注意:沒有考慮到b+i+1應該小於14
if(vis[i]==false&&b+i+1<14&&ten[i+b+1]==0){
ten[b]=i;
ten[b+i+1]=i;
vis[i]=true;
f(b+1);
//對數據進行還原,使得更好且正確的遞歸
ten[b]=0;
ten[b+i+1]=0;
vis[i]=false;
}
}
//如果循環完也沒找到,就進行回溯
return;
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章