首先介绍一下:
next_permutation(start,end),头文件<algorithm> , 作用是在[start,end)内存的数组产生严格的下一个字典序排列,具体来说就是[2,3,1] 可以变成[3,1,2] 然后继续变成[3,2,1].
上链接:P1706 全排列问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
上题干:
如果你学过深搜的话,这道题是思路一般为深搜。一个很基础的深搜,这里不过多赘述。
我们主要讲讲stl里面的函数用法,next_permutation(start,end);就是枚举所有的排列
首先定义一个数组arr[],然后从下标1开始,把下标赋值给对应的数组。
arr[1]=1,arr[2]=2........;
这一步是为了保证数组里面初始的是最小的字典序.
输出一次这个之后,再用next_permutation()严格递增。
也就是先do一次然后再循环,所以可以用do while .
注意,如果要判断是否枚举彻底,我们就要用next_permutation 作为跳出循环的条件,
如果枚举完了,就会返回0。
接下来上代码:
#include<iostream>
#include<algorithm>
#include<iomanip>
//场宽 cout<<setw(3)<<x; 代表3个场宽
using namespace std;
int a[11];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)a[i] = i;
for (int i = 1; i <= n; i++)
{
cout <<setw(5)<< a[i];
}
cout << endl;
for (; next_permutation(a + 1, a + 1 + n);)
{
for (int i = 1; i <= n; i++)
{
cout << setw(5) << a[i];
}
cout << endl;
}
}