全排列算法-递归

#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("\n");
    }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("\n");
        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;
}



posted @ 2019-03-16 21:07  ecnu_lxz  阅读(133)  评论(0编辑  收藏  举报