天天看點

數字間隔問題-遞歸

題目: 

一個14位的數字,由兩組1-7的數組成 

要求:1與1之間有一個數,2與2之間有兩個數,以此類推 

開頭兩位數字為7,4 

求出這個14位數

正确結果 74151643752362

/*
題目:
一個14位的數字,由兩組1-7的數組成
要求:1與1之間有一個數,2與2之間有兩個數,以此類推
開頭兩位數字為7,4
*/
 
#include<stdio.h>
 
 
 
int Change(int i,int n[],intm[]){        //  i目前需要變動的位置  n變動的數組 m取數的數組
    int j;
    for(;i<14;i++){
        if(n[i]==0){
            for(j=0;j<5;j++){
//             printf("i=%d,i=%d,j=%d,m[j]=%d\n",i,n[i],j,m[j]);   //友善檢視資料
                if(m[j]!=0&&n[i+1+m[j]]==0&&(i+1+m[j])<14){
                    n[i]=m[j];
                    n[i+1+m[j]]=m[j];
                    m[j]=0;
//                                                int len;              //友善檢視資料
//                                                for(len=0;len<14;len++){
//                                                 printf("%d ",n[len]);
//                                                  }                  //可以檢視結果
                    Change(i+1,n,m);
                    m[j]=n[i];
                    n[n[i]+1+i]=0;
                    n[i]=0;                  //恢複原狀态,進行下一步操作
                }
        }
    if(j==5&&n[i]==0){//避免不必要的遞歸加快速度。當然可以全排列
            break;
        }
    }
}
    if(i==14)
    for(i=0;i<14;i++){
        printf("%d",n[i]);//輸出結果 放在外部更好
    }
}
 
int main(){
    int n[14]={7,4,0,0,0,0,4,0,7,0,0,0,0,0};
    intm[5]={6,5,3,2,1};
    Change(2,n,m);
    return0;
}