zoukankan      html  css  js  c++  java
  • n全排列输出和 n个数的组合(数字范围a~b)

    n全排列输出:
    
    int WPermutation(int num, bool bRepeat)
    num表示num全排列
    
    bRepeat标志是否产生重复元素的序列。
    
     
    
    int Permutation(int n, int* A, int cur, bool bRepeat) 
    {
    	static int number = 0;
    	if(cur == n)
    	{   
    		number++;
    		for(int i = 0; i< n; i++)
    		{
    			printf("%d ", A[i]);
    		}
    		printf("
    ");
    	}
    	else
    	{
    		for(int i = 1; i <= n; i++)
    		{
    			int ok = 1;
    			for(int j = 0; j < cur; j++)    
    			{
    				if(!bRepeat)
    				{
    					if(A[j] == i)
    					{
    						ok = 0;
    					}
    				}
    			}
    			
    				if(ok)
    				{
    					A[cur] = i;
    					Permutation(n, A, cur + 1, bRepeat);
    				}			
    
    		}
    	}
    
        return number;
    }
    int WPermutation(int num, bool bRepeat)
    {
    	printf("%d permutation(%s): %d ~ %d
    ", num, bRepeat?"repeat mode":"single mode", 1, num);
    	int n = num;
    	int *A = (int*)malloc(n*sizeof(int));
    	memset(A, 0, sizeof(n*sizeof(int)));
    	int cur = 0;
    	int number = Permutation(n, A, cur, bRepeat);
    	delete [] A ;
    	A = NULL;
    	printf("over!
    ");
    	return number;
    
    }
    
    
    int Wpermutation(int st, int en, int n, bool bRepeat);
     n个数的组合(数字范围st~en),考虑重复元素:
    
    n表示n个数字组合
    
    每个数字范围:st~en
    
    bRepeat标志是否产生重复元素的序列。
    
     
    
    int Permutation(int st, int en, int n, int* A, int cur, bool bRepeat)
    {
    	static int number = 0;
    
    	if(cur == n)
    	{   
    		number++;
    		for(int i = 0; i< n; i++)
    		{
    			printf("%d ", A[i]);
    		}
    		printf("
    ");
    	}
    	else
    	{
    		for(int i = st; i <= en; i++)
    		{
    			int ok = 1;
    			for(int j = 0; j < cur; j++)
    			{
    				if(!bRepeat)
    				{
    					if(A[j] == i)
    					{
    						ok = 0;
    					}
    				}
    			}
    
    			if(ok)
    			{
    				A[cur] = i;
    				Permutation(st, en, n, A, cur + 1, bRepeat);			
    			}			
    
    		}
    	}
    
    	return number;
    }
    
    int Wpermutation(int st, int en, int n, bool bRepeat)
    {
    	printf("%d permutation(%s): %d ~ %d
    ", n, bRepeat?"repeat mode":"single mode", st, en);
    	int num = en - st + 1;
    	if(n > num)
    	{
    		bRepeat = true;
    		printf("too many number, to be repeat mode:
    ");
    	}
    
    	int *A = (int*)malloc(n*sizeof(int));
    	memset(A, 0, sizeof(n*sizeof(int)));
    	int cur = 0;
    	int number = Permutation(st, en, n, A, cur, bRepeat);
    	delete [] A ;
    	A = NULL;
    	printf("over!
    ");
    	return number;
    }
    

      

  • 相关阅读:
    论如何O(1)快速乘
    luogu3605晋升者计数
    分数规划小结
    洛谷 P1589 泥泞路 & 2019青岛市竞赛(贪心)
    洛谷 P3368 【模板】树状数组 2(区间加,单点查询)
    前缀和序列 & 差分序列
    洛谷 P3374 【模板】树状数组 1(单点加,区间和)
    2019青岛市程序设计竞赛游记
    0x3f3f3f3f 0xbfbfbfbf 等的原理及应用
    memset 初始化数组 & 实现原理
  • 原文地址:https://www.cnblogs.com/welen/p/3937745.html
Copyright © 2011-2022 走看看