【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;
}        

猜你喜欢

转载自www.cnblogs.com/lyc94620/p/9289267.html