zoukankan      html  css  js  c++  java
  • 全排列 —— 递归

    http://blog.sina.com.cn/s/blog_4d8721980100dxnv.html 转

    递归思想:
    取出数组中第一个元素放到最后,即a[1]与a[n]交换,然后递归求a[n-1]的全排列

    1)如果数组只有一个元素n=1,a={1} 则全排列就是{1}
    2)如果数组有两个元素n=2,a={1,2} 则全排列是
    {2,1}--a[1]与a[2]交换。交换后求a[2-1]={2}的全排列,归结到1)
    {1,2}--a[2]与a[2]交换。交换后求a[2-1]={1}的全排列,归结到1)
    3)如果数组有三个元素n=3,a={1,2,3} 则全排列是
    {{2,3},1}--a[1]与a[3]交换。后求a[3-1]={2,3}的全排列,归结到2)
    {{1,3},2)--a[2]与a[3]交换。后求a[3-1]={1,3}的全排列,归结到2)
    {{1,2},3)--a[3]与a[3]交换。后求a[3-1]={1,2}的全排列,归结到2)
    ...
    以此类推。
    马上用C++代码实现,成功!

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int n, N = 0;
    void g(int *q)
    {
    int i;
    for (i = 0; i < n; i++)
    printf(" %d", q[i]);
    N++;
    cout << endl;
    }

    void f(int *p,int size)
    {
    int j;
    if (size == 1)
    g(p);
    else
    {
    for (j = 0; j < size; j++)
    {
    // cout << p[j] << " " << p[size - 1] << " ";
    swap(p[j], p[size-1]);
    // cout << p[j] << " " << p[size - 1] << endl;
    f(p, size-1);
    swap(p[j], p[size-1]);
    }
    }
    }
    int main()
    {
    int a[] = {1, 2, 3};
    n = sizeof(a) / sizeof(int);
    f(a, n);
    cout << N << endl;
    return 0;
    }

  • 相关阅读:
    邻接表
    分治
    当遇到error: stray '241' in program错误的解决方法
    cmd / msys2 添加到右菜单
    洛谷P1003 铺地毯
    【洛谷P3372】【模板】线段树 1
    【codevs1082】线段树练习 3
    【codevs1081】线段树练习 2
    【codevs1080】线段树练习1
    【洛谷P1731】生日蛋糕
  • 原文地址:https://www.cnblogs.com/ghostTao/p/4014901.html
Copyright © 2011-2022 走看看