全排列问题
全排列简而言之是对于一个给定序列,给出其所有元素的所有排列情况。称之为一个序列的全排列。不难得出一个长度为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为例的结果: