1. 程式人生 > >佇列組合(棧和佇列)

佇列組合(棧和佇列)

題目描述

設計演算法以求解從集合{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);
    }
}