zoukankan      html  css  js  c++  java
  • 有重复元素的排列问题

    问题描述:设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个排列	%s
    ", 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的全排列如下:
    ", s);
        perm(s);
        return 0;
    }

  • 相关阅读:
    No necessary symbol fonts
    apt-get Error BrokenCount
    Repository XXX does not have a Realease file
    网页报错:You don't have permission to access
    Operating System not found
    JAVA平台AOP技术研究
    AOP技术基础
    SpringAOP浅析
    CGLIB动态代理
    Java设计模式—Proxy动态代理模式
  • 原文地址:https://www.cnblogs.com/ParaDise-LJ/p/6597485.html
Copyright © 2011-2022 走看看