佇列組合(棧和佇列)
阿新 • • 發佈:2019-01-04
題目描述
設計演算法以求解從集合{1…n}中選取k(k<=n)個元素的所有組合。例如,從集合{1…4}中選取2個元素的所有組合的輸出結果為:1 2,1 3,1 4,2 3, 2 4,3 4。
輸入
4 2
輸出
1 2
1 3
1 4
2 3
2 4
3 4
樣例輸入 Copy
3 2
樣例輸出 Copy
1 2
1 3
2 3
分析:
本題雖然說是用棧和佇列來做,但可惜本人太菜。只會用回溯來做。
#include"stdio.h" #include"string.h" int n,k; int a[10000],vis[10000]; void dfs(int j,int digit[]) { int i; if(j==k+1) { for(i=1; i<j-1; i++) printf("%d ",digit[i]); printf("%d\n",digit[i]); return ; } else { for(i=j; i<=n; i++) { if(vis[i]==1&&digit[j-1]<a[i]) { digit[j]=a[i]; vis[i]=0; dfs(j+1,digit); vis[i]=1; } } } } int main() { int i,j; int digit[10000]; while(~scanf("%d%d",&n,&k)) { for(i=1; i<=n; i++) { a[i]=i; digit[i]=0; vis[i]=1; } j=1; dfs(j,digit); } }