zoukankan      html  css  js  c++  java
  • 全排列算法-递归

    #include<algorithm>后,可以使用其中的next_permutation()函数

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <windows.h>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int a[3];
        int len=sizeof(a)/4;
        for(int i=0;i<len;i++)
        {
           a[i]=i+1;
        }
        do{//这里用do while,先输出未用排列函数打乱之前的排列,不然会少一个
            for(int i=0;i<len;i++)
                printf("%d",a[i]);
            printf(" ");
        }while(next_permutation(a,a+len));
        system("pause");
        return 0;
    }


    next_permutation()函数会重修排列数组,并返回true   false

    达到最后一个排列时,返回false

    void permutation(int a[],int start,int total)
    {
        if (start == total - 1)
        {
            //排列好了,进行操作
            for (int i = 0; i<total; i++)
                cout << a[i]<<" ";
            cout << endl;
            return;
        }
        int temp = 0;
        for (int i = start; i < total; i++)
        {
            //swap(*(a + start), *(a + i));
            swap(a[start], a[i]);//交换
            permutation(a, start + 1, total);
            swap(a[i], a[start]);//本次排列结束,恢复状态,等待下一个循环的交换
        }
    }

    或者用全局数组,传参数少

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <windows.h>
    #include <algorithm>
    using namespace std;
    #define n 5//   更大的数,控制台可能就没法显示全了,只显示后面的一部分
    void permut(int index);
    int a[n]={0};
    int p[n]={0};
    bool harsh[n]={false};
    int len=sizeof(a)/4;
    int cnt=0;
    int main()
    {
        //int len=sizeof(a)/4;
        for(int i=0;i<n;i++)
            a[i]=i+1;
        permut(0);
        cout<<cnt;
        system("pause");
        return 0;
    }

    void permut(int index)
    {
        if(index==len)
        {
            for(int i=0;i<len;i++)
                printf("%d",p[i]);
            printf(" ");
            cnt++;
            return;
        }
        for(int i=0;i<len;i++)
        {
            if(harsh[i]==false)
            {
                p[index]=a[i];
                harsh[i]=true;
                permut(index+1);
                harsh[i]=false;
            }else
            continue;
        }
        return;
    }



  • 相关阅读:
    初探并行线程的三种写法
    Revit2017二次开发-打印机配置
    test错误记录
    自行车出租系统错误集2
    错误记录-spring+mybatis
    Windows(64位IIS)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
    sqlDeveloper连接oracle
    Apriori算法-java
    Apriori算法-位运算-C语言
    Apriori算法-数组-C语言
  • 原文地址:https://www.cnblogs.com/lxzbky/p/10544344.html
Copyright © 2011-2022 走看看