• 全排列


    从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

    至于如何用代码实现, 我分了两种情况

    1. 在这 n 个元素中不存在相同元素

    2. 在这 n 个元素中存在相同元素

    #include <iostream>    // 不含相同元素的全排列 
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    char str[10];
    
    void solve(char *str_begin, char *str_end)
    {
    //    sort(str, str+strlen(str));
    //    puts(str);
        if(*str_end == '')
        {
            puts(str_begin);
        }
        
        else{
            for(char *tstr = str_end; *tstr != ''; tstr++)
            {
                    swap(*str_end, *tstr);
                    solve(str_begin, str_end+1);
                    swap(*str_end, *tstr);
            }
        }
    }
    /*
    void Permutation(char* pStr, char* pBegin)
    {
    //    assert(pStr && pBegin);
    
        if(*pBegin == '')
            printf("%s
    ",pStr);
        else
        {
            for(char* pCh = pBegin; *pCh != ''; pCh++)
            {
                swap(*pBegin,*pCh);
                Permutation(pStr, pBegin+1);
                swap(*pBegin,*pCh);
            }
        }
    }
    */
    int main()
    {
        gets(str);
        solve(str, str);
        puts("");
    //    Permutation(str, str);
        
        return 0;
    }

    下面是含有相同元素的全排列

    #include <iostream>    // 含相同字符的字符串全排列
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    
    char str1[10], str2[10];
    int len;
    
    void solve(char *d, char *s, int i)
    {
        char t;
        for(int j = 0; j< len; j++)
        {
            if(j> 0 && s[j] == s[j-1])
                continue;
            else if(s[j] != '#'){
                d[i] = s[j];
                t = s[j];
                s[j] = '#';
                if(i == len-1){
                    d[len] = '';
                    puts(d);
                }
                else{
                    solve(d, s, i+1);
                }
                s[j] = t;
            }
        }
    }
    
    int main()
    {
        gets(str1);
        len = strlen(str1);
        sort(str1, str1+len);
    //    puts(str1);
        solve(str2, str1, 0);
    
        return 0;
    }
    转载请注明出处:http://www.cnblogs.com/ygdblogs
  • 相关阅读:
    NSPrediccate 查询
    集合 不可变集合
    集合 不可变
    考核题 7
    考核题 6
    考核题 4
    练习题12
    练习题3
    iOS 实现在string任意位置添加新的表情
    在 ZBarSDK 中使用Block回调传值 Block在扫描成功后 变为空
  • 原文地址:https://www.cnblogs.com/ygdblogs/p/5373164.html
Copyright © 2020-2023  润新知