全排列问题

全排列问题

全排列简而言之是对于一个给定序列,给出其所有元素的所有排列情况。称之为一个序列的全排列。不难得出一个长度为n的序列,所有的全排列情况为n!种。
这里以n=3为例。

1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2

一共六种情况。

全排列是一个典型的递归问题,每次固定一个值为i的元素在index位置上,接下来对长度为n-1的序列再做这个操作,进行递归,并填补在index+1位置上的元素,直到index>n。完成一个序列的排序。通过设置一个命名为hash的bool型数组。来记录某个元素在index之前的迭代中有无使用过,如果使用过则无法再加入到index+1位置上。在后续迭代回溯的过程中会重置元素的使用情况。

对于回溯过程来说,在重置完元素使用情况后,还会就当前index位置上的元素遍历列表中i后的值,如果没有被使用过,那么又会被添加到index位置上,再次开始递归,由此得到所有的排列情况。

下面给出代码

#include<iostream>
using namespace std;
bool all_sort(int* &out,int index,int length,bool* &hash,int &sum)
{
    if (index > length)//超出递归边界后即显示当前的一种排序情况
    {
        for (int i = 1;i <= length;i++)
        {
            (i == length) ? cout << out[i] << endl : cout << out[i] << " ";
        }
        sum++;//记录下所有的排列情况数
        return false;
    }
    else
    {
        for (int i = 1;i <= length;i++)
        {
            if (!hash[i])//没有使用过值i的情况
            {
                out[index] = i;
                hash[i] = true;
                all_sort(out,index+1,length,hash,sum);
                hash[i] = false;
            }
        }
    }
}
int main(void)
{
    int n;
    int sum = 0;
    cin >> n;
    int* out = new int[n+1];
    bool* hash = new bool[n + 1]{false};
    all_sort(out, 1, n, hash,sum);
    cout << sum << endl;
    return 0;
}

以n=3为例的结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值