【ACM】組合數 - 全排列


組合數

時間限制: 3000 ms  |  內存限制:65535 KB
難度: 3
 
描述
找出從自然數1、2、... 、n(0<n<10)中任取r(0<r<=n)個數的所有組合。
 
輸入
輸入n、r。
輸出
按特定順序輸出所有組合。
特定順序:每一個組合中的值從大到小排列,組合之間按逆字典序排列。
樣例輸入
5 3
樣例輸出
543
542
541
532
531
521
432
431
421
321

 

 

思路:就是全排列嘛,可以衍生為八皇后問題

 

 

 

 

 
#include <iostream>
#include <cmath>
#include <cstdio>

using namespace std;
int count = 0;
int sum = 1;

bool rule(int *a, int num){

    for (int i = 1 ; i < num ; i++)
    {
        if (a[i-1]<a[i])
        {
            return false;
        }
    }
    return true;

}

void AllLine(int *a, int n, int k, int num){

    if (k==n-1)
    {
        if (count % sum==0 && rule(a,num))
        {
            int i;
            for (i = 0; i < num-1 ; i++)
            {
                cout<<a[i];
            }
            cout<<a[i]<<endl;
        }
        count++;
        return;
    }
    else
    {
        for (int z = k ; z < n ; z++)
        {
            swap(a[z],a[k]);
            AllLine(a,n,k+1,num);
            swap(a[z],a[k]);
        }
    }

}

int main(){

    int n,num;
    while(scanf("%d%d",&n,&num)!=EOF){

        for (int k = 1 ; k <= n-num ; k++)
        {
            sum *= k;
        }


        int *a = new int[n];
        for (int i = 0 ; i < n ; i++)
        {
            a[i] = n-i;
        }
        AllLine(a,n,0,num);

    }

    return 0;
}        

 

全排列基本模型(注:根據題型,可以將 int 數組換成 char 等):

#include <iostream>
#include <cmath>
using namespace std;


void foo(int n,int k,int *a){
    if(k==n-1)
    {
        for(int i = 0;i<n;i++){
            cout<<a[i]<<" ";
        }
        cout<<endl;
        return;
    }else{
        for(int j = k; j < n; j++){
            int temp=a[k];
            a[k]=a[j];
            a[j]=temp;
            foo(n,k+1,a);
            temp=a[k];
            a[k]=a[j];
            a[j]=temp;
        }
    }
    
}


int main() {
    int n=4;
    int *a = new int[n];
    for(int i=0;i<n;i++){
        a[i]=i+1;
    }
    for(int i=0;i<n;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
    cout<<"begin"<<endl;
    foo(n,0,a);
    cout<<"end"<<endl;
    return 0;
}

輸出:

1 2 3 4 
begin
1 2 3 4 
1 2 4 3 
1 3 2 4 
1 3 4 2 
1 4 3 2 
1 4 2 3 
2 1 3 4 
2 1 4 3 
2 3 1 4 
2 3 4 1 
2 4 3 1 
2 4 1 3 
3 2 1 4 
3 2 4 1 
3 1 2 4 
3 1 4 2 
3 4 1 2 
3 4 2 1 
4 2 3 1 
4 2 1 3 
4 3 2 1 
4 3 1 2 
4 1 3 2 
4 1 2 3 
end

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM