标签:模拟、排序、全排列、搜索
【题解】
通过交换来得到下个全排列,交换的前提是交换左边的数要小于交换右边的数。
先从右往左找到左边小于相邻右边的数的位置k,再从右往左找到大于该数的数(可能会有多个),然后交换这两个数,最后要让k位置后的数排列成升序。
【代码】
#include <iostream>
#include <algorithm>
using namespace std;
int m, n, k; //k表示当前选取到第几个数
int a[10005];
void permutation()
{
for (k = n - 1; k >= 1; k--)//找到最后可增加的位,即定位
{
if (a[k] < a[k + 1])
break;
}
for (int i = n; i > k; i--)//找到最小可增加的数字
{
if (a[i] > a[k])
{
swap(a[i], a[k]); //交换
break;
}
}
sort(a + k + 1, a + n + 1); //让下标k后面的序列升序
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
while (m--)
permutation(); //一次排列
for (int i = 1; i <= n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}