有重复元素的排列问题

问题描述:设R={r1,r2,···,rn}是要进行排列的n个元素。其中元素r1,r2···rn可能相同。试设计一个算法,列出R的所有不同排列

算法设计:给定n及待排列的n个元素,计算出这n个元素的所有不同排列

设计思路:共有m个数的数组,排列到第k位时查看数组下标从k到m的数中是否有数字与下标为k的数字相等,相等的不交换,不相等则交换得新排列

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
void Swap(char *a, char *b)
{
    char t = *a;
    *a = *b;
    *b = t;
}
//在s数组中,[lo,hi)中是否有数字与下标为hi的数字相等
 int swap(char *s, int lo, int hi)
{
    int i;
    for (i = lo; i < hi; i++)
        if (s[i] == s[hi])
            return 0;
        return 1;
}
//k表示当前选取到第几个数,m表示共有多少数.
void AllRange(char *s, int k, int m)
{
    int i;
    if (k == m)
    {
        static int x = 1;
        printf("  第%3d个排列\t%s\n", x++, s);
    }
    else
    {
        for (i = k; i <= m; i++) //第i个数分别与它后面的数字交换就能得到新的排列
        {
            if (swap(s, k, i))
            {
                Swap(s + k, s + i);
                AllRange(s, k + 1, m);
                Swap(s + k, s + i);
            }
        }
    }
}
void perm(char *s)
{
    AllRange(s, 0, strlen(s) - 1);
}
int main()
{
    char s[] = "1123";
    printf("%s的全排列如下:\n", s);
    perm(s);
    return 0;
}

时间: 2024-10-14 02:49:38

有重复元素的排列问题的相关文章

UVA - 11076 Add Again (重复元素的排列)

Summation of sequence of integersis always a common problem in Computer Science. Rather than computing blindly,some intelligent techniques make the task simpler. Here you have to find thesummation of a sequence of integers. The sequence is an interes

蓝桥杯——说好的进阶之去重复元素的排列组合

将待排列(组合)的数组,先分别统计出种类和个数,然后进行避免重复的排列(组合). /* 1,1,2,3的排列组合 去重复 * (借此复习排列组合) * * 1:2 2个1 * 2:1 1个2 * 3:1 1个3 * * */ static int[] iarr = new int[3];//目标序列 static int[] carr = new int[] { 1, 2, 3 };//3种item static int[] used = new int[] { 2, 1, 1 };//每种it

含有重复元素的排列

Description 设R={ r1, r2, ……, rn }是要进行排列的n个元素.其中元素r1 ,r2 ,……,rn可能相同.试设计一个算法,列出R的所有不同排列.给定n以及待排列的n个元素.计算出这n个元素的所有不同排列. Input 输入数据的的第1行是元素个数n,1≤n≤500.接下来的1行是待排列的n个元素. Output 将计算出的n个元素的所有不同排列输出,每种排列占1行,最后1行中的数是排列总数. Sample Input 4 aacc Sample Output aacc

无重复元素的排列

/*========================================================== 设有n个整数的集合{1,2,3,......,n},从中任意选择r个数进行排列. 其中r<n,请列出所有排列. 思路:递归r层,每层选择一个数放到a[].当递归到r层时得到一组排列. 在每一层中做选择的时候,要把所有可能的选择都进行尝试. 具体看代码. ============================================================*/

枚举有重复元素的排列的两种方法

我们假设A数组是方案数组,P数组是模板数组. 对于每一种方案,从第一个位置开始放元素,一个一个放. 我们原有的打印全排列的方法是不允许A数组中出现重复元素的,如下代码所示: void dfs(int dp) { if(dp>n) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; ans++; cout<<endl; return; } for(int i=1;i<=n;i++) { if(!vis[i

Ka的回溯编程练习 Part6.5|详解|有重复元素的排列问题

#include <stdio.h> #define br printf("\n"); int ans=0; char el[502]; int confirm(int i,int k) //往回比较,如果元素有相同跳过此情况 { if(i>k) { while(i>k) { if(el[i]==el[k]) return 0; k++; } } return 1; } void op(int n) { ans++; int j; for(j=0;j<=n

[LintCode] 带重复元素的排列

递归实现: 1 class Solution { 2 public: 3 /** 4 * @param nums: A list of integers. 5 * @return: A list of unique permutations. 6 */ 7 vector<vector<int> > permuteUnique(vector<int> &nums) { 8 // write your code here 9 sort(nums.begin(), n

Ka的回溯编程练习 Part6|有重复元素的排列问题

第一个问题: 有红球4个,白球3个,黄球3个,将它们排成一排共有多少种排法 #include <stdio.h> int BallsIUsed[201]; int BallsIHave[201]={0}; int total=0; int k; void op() { int i; total++; printf("%d:",total); for(i=1;i<=k;i++) { printf("%c",BallsIUsed[i]); } prin

减治求有重复元素的全排列

求n个元素的全排列的所有解可以用减治法:每次拎出一个数做前缀,对剩下的元素再求全排列,直至只剩一个元素.代码源自<算法分析与设计(王晓东)>,复杂度O(n2) 1 //输出k~m的所有全排列 2 void perm(int k,int m) 3 { 4 if(k==m) 5 { 6 for(int i=0;i<=m;i++) 7 printf("%d ", list[i]); 8 printf("\n"); 9 }else 10 { 11 for(