• 算法:C++排列组合



    题目:给定1-n数字,排列组合。

    解法:递归。第一个数字有n种选择,第二个数字有n-1种选择,依次递归排列输出。用数组表示n个数字,用过的数字置0。

    实现语言:C++


    #include <iostream>
    using namespace std;
    
    /************************************************************************/
    /* 
    	num : 需要排列的数组
    	count : 数组总数
    	numC: 已经排列的数组
    	iUse:已经排列的个数
    	iNull:置0的个数  
    	sum: 总排列数
    */
    /************************************************************************/
    template <class T>
    void ComBineNum(T *num, const int count, T *numC, int iUse, int* sum)
    {
    	int iNull = 0;
    	T *newNum = new T[count];
    	for (int i = 0; i < count; ++i){	
    		memcpy(newNum, num, count);
    		if (newNum[i] == 0){
    			++iNull;
    			if (iNull == count){
    				for (int i = 0; i < count; ++i){
    					cout << numC[i];
    				}
    				cout << endl;
    				++(*sum);
    				return;
    			}
    			continue;
    		}
    		numC[count - iUse] = newNum[i];
    		newNum[i] = 0;
    		ComBineNum(newNum, count, numC, iUse - 1, sum);
    	}
    	delete[] newNum;
    }
    
    
    int main()
    {
    	int sum = 0;
    	const int count = 4;
    	char num[count], pNum[count];
    	for (int i = 0; i < count; ++i){
    		num[i] = i + '1';
    	}
    	ComBineNum<char>(num, count, pNum, count, &sum);
    	cout << "sum :" << sum << endl;
    
    	sum = 1;
    	for (int i = 1; i <= count; ++i){
    		sum *= i;
    	}
    	cout << "sum :" << sum << endl;
    
    	return 0;
    }


    输出:





    template <class T>
    void Swap(T& a, T& b)
    {
    	T c = a;
    	a = b;
    	b = c;
    }
    
    template <class T>
    void Perm(T list[], int k, int m, int* count)
    {
    	if (k == m){
    		for (int i = 0; i < m; ++ i){
    			cout << list[i];
    		}
    		cout << endl;
    		++(*count);
    	}
    	else{
    		for (int i = k; i < m; ++i){
    			Swap(list[k], list[i]);
    			Perm(list, k + 1, m, count);
    			Swap(list[i], list[k]);
    		}
    	}
    }
    
    int main()
    {
    	const int m = 4;
    	int count = 0;
    	int list[m];
    	for (int i = 0; i < m; ++i){
    		list[i] = i + 1;
    	}
    	
    	Perm(list, 0, m, &count);
    	cout << count;
    	return 0;
    }





    文/yanxin8原创,获取更多信息请访问http://yanxin8.com/261.html



  • 相关阅读:
    JZOI 4020 Revolution
    JZOJ 4018 Magic
    JZOJ 4017 逃跑
    JZOJ 4016 圈地为王
    JZOJ 4015 数列
    JZOJ 3960 鸡腿の出行
    BZOJ 5005 & JZOI 3959 鸡腿の乒乓
    GCJ2009B&JZOJ 4033 Min Perimeter
    jzoj 3948 Hanoi 塔
    [纯符][纯粹的无聊] 神奇的递推式
  • 原文地址:https://www.cnblogs.com/iplus/p/4467095.html
Copyright © 2020-2023  润新知