美文网首页信息安全专业知识
全排列(next_permutation)算法

全排列(next_permutation)算法

作者: 简言之_ | 来源:发表于2019-03-08 11:34 被阅读10次

功能: 给定一个具有n个元素的集合,要求输出这个集合中元素的全部可能的排列。

STL有一个函数next_permutation(),它的作用是假设对于一个序列,存在依照字典排序后这个排列的下一个排列,那么就返回true且产生这个排列,否则返回false。
注意,为了产生全排列,这个序列要是有序的,也就是说要调用一次sort。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
      int ans[4]={1,2,3,4};
      sort(ans,ans+4);    /* 这个sort可以不用,因为{1,2,3,4}已经排好序*/
      do                             /*注意这步,如果是while循环,则需要提前输出*/
      {
        for(int i=0;i<4;++i)//循环输出ans[i]
             cout<<ans[i]<<" ";
             cout<<endl;
     }while(next_permutation(ans,ans+4));
    return 0;
}
image.png

手写全排列:

#include <iostream>
using namespace std;

void f(int x[], int k,int m)//全排列 数组x长度为k--m
{
    int i,t;
    if(k>=m){//输出所有情况 
        for(i=0;i<m;i++){
        printf("%d",x[i]);  
    }
        printf("\n");
    }
    
    for(i=k; i<m; i++){ //递归穷举所有可能情况 
        {t=x[k]; x[k]=x[i]; x[i]=t;}
        f(x,k+1,m);
        {t=x[k]; x[k]=x[i]; x[i]=t;}
    }
}
    
int main()
{
    int x[] = {1,2,3};
    f(x,0,3);    
    return 0;

}

例题:

五、九数组分数

1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?

下面的程序实现了该功能,请填写划线部分缺失的代码。

#include <stdio.h>

void test(int x[])
{
    int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];//分子 
    int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];//分母 
    
    if(a*3==b) printf("%d / %d\n", a, b);//组成分数为三分之一 
}

void f(int x[], int k)//全排列 
{
    int i,t;
    if(k>=9){
        test(x);
        return;
    }
    
    for(i=k; i<9; i++){
        {t=x[k]; x[k]=x[i]; x[i]=t;}
        f(x,k+1);
        _____________________________________________ // 填空处
    }
}
    
int main()
{
    int x[] = {1,2,3,4,5,6,7,8,9};
    f(x,0);    
    return 0;
}

注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

分析:f(x,k+1)回溯之后,将交换后的结果还原使用回朔法。

答案:{t=x[k]; x[k]=x[i]; x[i]=t;}

相关文章

  • 全排列(next_permutation)算法

    功能: 给定一个具有n个元素的集合,要求输出这个集合中元素的全部可能的排列。 STL有一个函数next_permu...

  • 递归-全排列

    对数组{1,2,3}进行全排列 STL next_permutation

  • 全排列问题偷鸡做法

    全排列问题偷鸡摸狗做法用强大的(猥琐的)next_permutation 31. 下一个排列 46. 全排列 47...

  • 全排列生成算法 next_permutation

    概念 全排列的生成算法有很多种,有递归遍例,也有循环移位法等等。C++/STL中定义的next_permutati...

  • HJ89 24点运算

     解法思想,全排列+递归。 Reference[1] next_permutation 的原理和使用[https:...

  • 全排列

    对于函数prev_permutation()与next_permutation()全排列的用法直接观察输入输出,一...

  • C/C++全排列函数

    C++中有全排列函数next_permutation,前提是数据必须有序,因此先对其进行排序,再使用该函数: 全排...

  • 使用C++ STL的next/prev_permutation函

    使用C++ STL的next_permutation函数可以简单的枚举出一个升序排列的字符串的全排列,它包含在头文...

  • 46. Permutations

    算法 1: 递归数组 的全排列,等价于全排列与可能的取值组合得到。 算法 2: 计算一个排列 按字典升序排列的紧...

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

网友评论

    本文标题:全排列(next_permutation)算法

    本文链接:https://www.haomeiwen.com/subject/whzlpqtx.html