1. 程式人生 > >溫習全排列

溫習全排列

個數字 append lin urn data- esp int continue javascrip

全排列

題目
找出從自然數1,2,…… n中任取r個數的組合。

比如n=5,r=3。
可用這種遞歸思想來考慮組合函數的算法,設子程序[計算分組子程序(m,k)] ,即找出自然數1。2……m中任取k個數的全部組合。當組合的第一個數字選定時,其後面的數字是從余下的m-1個數中取k-1個數的全部組合。


比如 n=3,r=2。
12 21 13 31 23 32
比如 n=3 r=3;
123 132 213 232 312 321

題解:從序號1選擇,一直到序號r。

每一個序號有n種選擇(排除已經選擇過的)。這道題目就是dfs加上回溯
關鍵代碼

void DFS(int
y,int temp[])//y為已經選擇到了的序號。temp數組用來存儲選好的數據 { if(y>r)return ; if(y==r)//選完了,進行輸出 { for(int i=0;i<r;i++){ printf("%d",temp[i]); } printf("\n"); return ; }else{ int u; for(int i=0;i<n;i++)//進行選擇 { if(a[i]==0
)continue;//0為已經選擇的意思 else{ u=a[i]; temp[y]=a[i]; a[i]=0; DFS(y+1,temp);//回溯 a[i]=u; temp[y]=0; } } } }

全然代碼

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std; int n,r,a[9]; void DFS(int y,int temp[]){ if(y>r)return ; if(y==r){ for(int i=0;i<r;i++){ printf("%d",temp[i]); } printf("\n"); return ; }else{ int u; for(int i=0;i<n;i++){ if(a[i]==0)continue; else{ u=a[i]; temp[y]=a[i]; a[i]=0; DFS(y+1,temp); a[i]=u; temp[y]=0; } } } } int main() { int temp[9]; scanf("%d%d",&n,&r); for(int i=0;i<n;i++) a[i]=i+1; DFS(0,temp); }

溫習全排列